一、JVM分代

heap

新生代Young Generation ):新对象的分配,当新生代填满时,触发*minor garbage collection*,达到一定年龄的新生代会移动到老年代,默认为15。

老年代Old Generation):储存长期对象,当老年代满时,触发*major garbage collection*。(另外还有full GC,清理老年代以及新生代,应当尽量避免)。

永久代Permanent generation)(过时):包含由JVM来描述应用程序使用的类和方法所需的元数据,如常量,静态变量。JVM在运行时根据应用程序使用的类填充永久代。此外,Java SE库类和方法可以存储在此处。

元空间Metaspace):在 JDK1.8 中已经移除了永久代(方法区),并使用了一个元数据区域进行代替(Metaspace)。

Stop the World Event:所有的minor garbage collections 都是 "Stop the World" 事件,当该事件触发时,所有的线程都会停止直到其完成。

二、Java垃圾回收常见算法

  1. 自动垃圾收集是查看堆内存,识别正在使用哪些对象以及哪些对象未使用的过程,以及删除未使用的对象。使用中的对象或引用的对象意味着程序的某些部分仍然维护指向该对象的指针。程序的任何部分都不再引用未使用的对象或未引用的对象。因此可以回收未引用对象使用的内存。

  2. 在像C这样的编程语言中,分配和释放内存是一个手动过程。在Java中,解除分配内存的过程由垃圾收集器自动处理。

常见的垃圾回收算法有以下几种:

1. 标记清除算法

marking

将需要回收的对象标记,会扫描所有对象,比较耗费时间。

normaldelete

删除未引用的对象,保留引用的对象和指向可用空间的指针。内存分配器保存对可以分配新对象的可用空间块的引用。

2. 标记整理算法

除了删除垃圾对象外(即上面的过程),还需要将引用对象压缩,即将对象移动到一起,方便新的内存分配。

compacting

3. 复制算法

新生代使用该算法,在新生代中,分为了Eden区from survivor spaceto survivor space。新建对象在Eden区。

具体流程:

  1. 内存分配(新建对象)

allocation

  1. eden区满时,minor GC触发

fillingeden

  1. 引用对象移动到s0,在eden中的未引用对象被删除

copyingreferenced

  1. 当下一次minor GC时,在eden中将继续删除未被引用的对象,但是存活对象将移动到第二个survivor区域s1,并且存活对象每移动一次年龄加1,s0eden中的未被引用对象将会被清理

objectAging

  1. 再次重复过程,然后survivor区域将切换,对象从s1移动到s0,并且年龄加1

addAging

  1. minor GC后,如果对象年龄到达阈值(默认15,图示为8),将移动到老年代

promotion

  1. minor GC继续发生,继续提升对象到老年代

promotion2

  1. 最后将发生major GC清理老年代,采用标记整理算法(清理并且压缩空间)

gcSummary

4.总结

新生代GC主要采用复制算法,老年代采用标记清理算法(Hotspot)。新生代和老年代的默认比例为 1:2,也就是说新生代占用 1/3的堆内存,而老年代占用 2/3 的堆内存。新生代中eden8/10,两个survivor 个占1/10(本篇文章说的都是Hotspot)

三、常见参数

1. JVM参数

参数描述
-Xms设置JVM启动时的初始堆大小。
-Xmx设置最大堆大小。
-Xmn设置新生代的大小。
-XX:PermSize设置永久代的起始大小。
-XX:MaxPermSize设置永久代的最大大小

2. 新生代参数

参数描述
-XX:NewRatio新生代和老年代的占比,如果为4即为1:4,新生代占有1/5
-XX:SurvivorRatioeden和survivor的占比,如果为8即为8:2,eden占有8/10,survivor个占1/10
-XX:+PrintTenuringDistribution显示每次Minor GCSurvivor区中各个年龄段的对象的大小
-XX:InitialTenuringThreshol晋升到老年代的对象年龄的最小值
-XX:MaxTenuringThreshold晋升到老年代的对象年龄的最大值

参考地址:

Java Garbage Collection Basics

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

人生中没有四季 唯有那寒冬的荒野