应用 Java 快一年工夫了,从最早大学时候对 Java 的憎恨,到逐步承受,到工作中领会到了 Java 开发的各种便捷与福利,这的确是一门不错的开发语言。不仅是 Intellij 开发 Java 程序的痛快,还有无需手动治理内存的便捷、Maven 治理依赖的整洁、SpringCloud 大礼包的规整等等。
所以,作为一个有谋求的 Java 程序员,深刻底层把握 GC(垃圾回收)的机制,应该算是必备的技能了。本文即我在学习过程中的一些个人观点以及心得,不正之处敬请斧正。
JVM 的运行数据区
首先我简略来画一张 JVM 的构造原理图,如下。
image
咱们重点关注 JVM 在运行时的数据区,你能够看到在程序运行时,大抵有 5 个局部。
1、办法区
不止是存“办法”,而是存储整个 class 文件的信息,JVM 运行时,类加载器子系统将会提取 class 文件外面的类信息,并将其寄存在办法区中。例如类的名称、类的类型(枚举、类、接口)、字段、办法等等。
2、堆(Heap)
相熟 c/c++ 编程的同学们应该相当相熟 Heap 了,而对于 Java 而言,每个利用都惟一对应一个 JVM 实例,而每一个 JVM 实例惟一对应一个堆。堆次要包含关键字 new 的对象实例、this 指针,或者数组都放在堆中,并由利用所有的线程共享。堆由 JVM 的主动内存管理机制所治理,名为垃圾回收—— GC(garbage collection)。
在 Java 中对象都是都 JVM 帮忙治理的,那什么时候对象才会被回收,答案就是对象成为了垃圾对象,就是没有被援用的对象。怎么确定是否被援用呢?有两种形式
计数法
给每个对象中增加一个援用计数器,每当有中央援用它时,计数器值就加一;当援用生效时,计数器值就减一;计数器为 0 的对象就是能够回收的对象。
这个办法的长处就是速度很快,效率高,然而这个办法有个循环援用的问题。循环依赖的对 HantecMarkets 亨达返佣 https://www.kaifx.cn/broker/h…,然而计数也不是零,因而不会被回收。