应用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...,然而计数也不是零,因而不会被回收。