Java堆内存解析和垃圾回收机制

JVM(java虚拟机)的内存结构分为堆、栈、本地方法栈、方法区等。栈主要保存线程、进程等相关信息,本地方法栈用于支持native人方法,方法区主要存储类、静态变量、属性、方法等,这些信息存放在PermanetGeneration中,可以通过-XX:PermSize-XX:MaxPermSize来指定最小值和最大值。下面详细介绍一下堆内存:

java中所有new出来的对象都保存在堆中,堆的大小可以通过-Xms-Xmx指定。堆 又分为三代,Young(新生代)、Old(年老代)和Permanent(永久代)。新生代又分为Eden和Survivor区,新创建的对象都在 Eden区、如果Eden区空间不足,就会讲存活的对象复制到Survivor区,如果Survivor区空间不足,就会将Survivor中一直存活的 对象复制到Old年老区。当young代内存满,就执行young gc,young gc需要高速、频繁地执行。当old或permanent代内存满,就会执行full gc(magor gc),所有代内存都会gc,一般先young gc后old gc、permanent gc,old 代内存有空间大、因此增长缓慢、gc不频繁,一次full gc花费的时间也较多。

Windows中的tomcat开启gc日志的方法:在catlinna.bat中添加set CATALINA_OPTS=-XX:ParallelGCThreads=4 -XX:+PrintGCDetails -Xloggc:D:/work/apache-tomcat-7.0.37-windows-x64/apache-tomcat-7.0.37/logs/tomcat_gc.log,gc日志就会打印到我们指定的日志文件中。 它的格式应该是这样:
Young gc 86.188: [GC [PSYoungGen: 32896K->880K(33024K)] 98532K->66588K(99264K), 0.0041792 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
young-gc
Full GC
86.703: [Full GC [PSYoungGen: 960K->0K(33024K)] [PSOldGen: 66156K->54196K(68288K)] 67116K->54196K(101312K) [PSPermGen: 61325K->60902K(83968K)], 0.2525489 secs] [Times: user=0.23 sys=0.00, real=0.25 secs]

old-gc

版权声明

本站文章、图片、视频等(除转载外),均采用知识共享署名 4.0 国际许可协议(CC BY-NC-SA 4.0),转载请注明出处、非商业性使用、并且以相同协议共享。

© 空空博客,本文链接:https://www.yeetrack.com/?p=538