当前位置: 首页 > 后端技术 > Java

Java训练JVM内存模型与GC机制浅析

时间:2023-04-01 17:37:39 Java

以下文章转载自IT什么是GC?GCGarbageCollection:Java语言的特点之一,开发者无需关心内存资源的释放,但会增加软件系统的负担。有利也有弊,但选择合适的GC显然会利大于弊。首先让我们对JVM内存区有个大概的了解:JVM内存模型:注:1.java8之后取消了permanentzone,设置了metaspace(不占用虚拟机内存,而是占用机器的本地内存),常量池放在方法区。2、私有内存是随着线程的产生而产生的。一旦线程终止,私有内存区就会自动清除,所以垃圾回收不在本次讨论范围之内。专注堆内存_java训练。堆内存:概念:所有的对象实例,不管是死的还是活的,都必须分配在堆上。功能:动态申请分配一定大小的内存空间模型:负责垃圾收集器GC的通用算法垃圾收集算法概述:1.复制算法:根节点扫描所有存活的对象并复制到新的内存中,并回收原来的记忆。----适用于新生代2.mark-clear算法:两个阶段,markphase和clearphase,从根节点开始,unmarked是未引用的垃圾对象,clear阶段清除所有未标记的对象。3.mark-compression算法:在mark-clear的基础上进行了优化,经过一轮扫描后,先将所有库存对象压缩到内存的另一端,然后清理所有边界外的空间,可以避免碎片的产生。4.代回收算法:不同年龄使用不同的算法,选择最合适的。新生代存活率低,可以采用复制算法,而老年代存活率高,无法保证额外分配空间,采用标记清除或标记整理(压缩)。新生代GC:MinorGC垃圾回收,eden中存活的对象会被复制到未使用的sur0,正在使用的sur1的年轻对象也会被复制到sur0(大老对象进入老年代),如果sur0是已经对象满了,对象也直接进入老年代。此时eden和sur1中剩余的对象都是垃圾对象,直接清空,sur0中所有存活的对象这次都被回收了。复制算法保证了内存的连续性,避免了内存丢失。浪费空间。最后,交换sur0和sur1,保持sur0为空,依此类推。如果这个对象最多被复制了16次,那么这个对象就可以送到oldgeneration_java培训机构了。特点:高频快速Survivor的意义:减少送往老年代的对象数量,从而减少FullGC的发生。Survivor预筛选保证只有经过16次MinorGC存活下来的对象才能在新生代中存活下来。将被送往晚年。保证一个survivor空间永远是空的,另一个非空的survivor空间没有碎片。OldgenerationGC:MajorGC:存活16次后,会被送到老年代。老年代空间一般较大,采用mark-clear算法。扫描后回收会造成内存碎片。可以规避标记压缩算法。特点:频率低,速度慢,也就是年老代放不下的时候发生FullGC,耗时长。System.gc()也会发生。垃圾收集器分类:1.使用串行收集器的相关参数:-XX:+PrintGCDetails:打印GC信息。-XX:+UseSerialGC:新生代和老年代都使用串行收集器。-XX:+UseParNewGC:新生代使用并行收集器,老年代使用串行收集器。2、使用并行收集器的相关参数:-XX:+UseParNewGC:新生代使用并行收集器,老年代使用串行收集器。-XX:ParallelGCThreads:并行收集器工作时的线程数。-XX:+UseParallelGC:新生代使用并行收集器,老年代使用串行收集器。-XX:+UseParallelOldGC:新生代和老年代都使用并行回收收集器。-XX:+MaxGCPauseMills:设置最大垃圾回收暂停时间,其值为大于0的整数。-XX:+GCTimeRatio:设置吞吐量大小,其值为0-100之间的整数。假设GCTimeRatio的值为n,那么系统在垃圾回收上花费的时间不会超过1/(1+n)。3、使用CMS收集器相关参数:-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器。-XX:CMSInitiatingOccupancyFraction:指定回收阈值,默认为68。-XX:+UseCMSCompactAtFullCollection:CMS在垃圾回收完成后进行一次内存碎片整理。内存碎片整理不是同时进行的。-XX:CMSFullGCsBeforeCompaction:设置CMS回收次数后,进行一次内存压缩。4.使用G1recycler相关参数:-XX:+UnlockExperimentalVMOptions:允许使用实验参数。–XX:+UseG1GC:启用G1收集器。-XX:MaxGCPauseMills:设置G1收集器的最大暂停时间。-XX:GCPauseIntervalMills:设置G1收集器的目标暂停间隔。