1. Java堆中各代分布:
图1:Java堆中各代分布
Young:主要是用来存放新生的对象。
Old:主要存放应用程序中生命周期长的内存对象。
Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。
2. JVM 使用的GC算法是什么?
分代收集。
即将内存分为几个区域,将不同生命周期的对象放在不同区域里;
在GC收集的时候,频繁收集生命周期短的区域(Young area);
比较少的收集生命周期比较长的区域(Old area);
基本不收集的永久区(Perm area)。
3. GC 和 Full GC 有什么区别?
GC(或Minor GC):收集 生命周期短的区域(Young area)。
Full GC (或Major GC):收集生命周期短的区域(Young area)和生命周期比较长的区域(Old area)对整个堆进行垃圾收集。
他们的收集算法不同,所以使用的时间也不同。 GC 效率也会比较高,我们要尽量减少 Full GC 的次数。 当显示调用System.gc() 时,gc does a full collection(both young generation and tenured generation).
4. Minor GC后,Eden是空的吗?
是的,Minor GC会把Eden中的所有活的对象都移到Survivor区域中,如果Survivor区中放不下,那么剩下的活的对象就被移到Old generation 中。
5. Garbage collection options(JDK1.4):
图2:GC参数
堆设置
-Xms :初始堆大小
-Xmx :最大堆大小
-XX:NewSize=n :设置年轻代大小
-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n :设置持久代大小
收集器设置
-XX:+UseSerialGC :设置串行收集器
-XX:+UseParallelGC :设置并行收集器
-XX:+UseParalledlOldGC :设置并行年老代收集器
-XX:+UseConcMarkSweepGC :设置并发收集器
垃圾回收统计信息
-XX:+PrintHeapAtGC GC的heap详情
-XX:+PrintGCDetails GC详情
-XX:+PrintGCTimeStamps 打印GC时间信息
-XX:+PrintTenuringDistribution 打印年龄信息等
-XX:+HandlePromotionFailure 老年代分配担保(true or false)
并行收集器设置
-XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间
-XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
并发收集器设置
-XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。
-XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
6. 例子:Heap size 设置
场景:在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令:
java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar
系统输出:
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 1" java.lang.OutOfMemoryError: Java heap space
Exception in thread “Image Fetcher 2” java.lang.OutOfMemoryError: Java heap space
|
调优:将-Xms和-Xmx选项设置为32m,而-Xmn为1/4的-Xmx值。
结果:执行java -jar –Xmn8m –Xms32m -Xmx32m SwingSet2.jar,系统正常运行。
7. JVM Runtime Data Area(运行时数据区):
图3:JVM运行时数据区(一)
Heap:JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。
Method area:JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。
Java Stacks:每个JVM线程拥有一个私有的栈。
Pc registers:JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(programcounter)寄存器。
Native method stacks:保存native方法进入区域的地址。
图4:JVM运行时数据区(二)
Heap和Method area被所有线程共享,其生存期和JVM的生存期相同;Java Stacks、Pc registers、Native method stacks被每个线程独自拥有,其生存期和线程的生存期相同。
8. 常见的内存泄露错误
很多开发人员都碰到过java.lang.OutOfMemoryError的错误。这种错误又分两种:java.lang.OutOfMemoryError: Java heap space和java.lang.OutOfMemoryError: PermGen space。引起这种错误的原因可能是程序问题,也可能是是JVM参数配置问题引起的。若是参数问题,前者可以同过配置-Xms和-Xmx参数来设置,而后者可以通过配置-XX:PermSize和-XX:MaxPermSize来设置。
9. 参考资料:
1. A brief history of garbage collection –
http://www-128.ibm.com/developerworks/java/library/j-jtp10283/
2. Garbage collection in the HotSpot JVM –
http://www-128.ibm.com/developerworks/java/library/j-jtp11253/
3. Tuning Garbage Collection with the 5.0 JavaTM Virtual Machine
http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html
4. Diagnosing a GC problem –
http://java.sun.com/docs/hotspot/gc1.4.2/example.html
5、http://www.precisejava.com
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:-HandlePromotionFailure -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails -XX:+PrintTenuringDistribution
相关推荐
GCViewer 能否分析 java 程序 GC 日志,能否图表展示堆内存,年轻代,老年代,永久带以及full gc 的使用情况
JVM内存模型架构图,核心部分包括: GC主要在新生区(伊甸园区)、老年区 新生区(伊甸园区(对象都是在这个区new出来的)、幸存区to、幸存区from:幸存区位置会互相交换... jdk1.8之后:无永久代,常量池在元空间中
根据堆中对象的存活周期将堆内存分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活。而老年代中存放的对象存活率高。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括...
当准备要触发一次Young GC时,如果发现统计数据说之前Young GC的平均晋升大小比目前老年代剩余的空间大,则不会触发Young GC而是转为触发Full GC。(通常情况) 如果有永久代的话,在永久代需要分配空间但已经没有...
PL2303GC提供了一种方便的小型解决方案,用于将类似RS232的全双工异步串行设备连接到任何USB主机。 Prolific提供了高度兼容的驱动程序,该驱动程序可以在大多数操作系统上模拟传统的COM端口,从而允许基于COM端口的...
jvm-full-gc调优-jvm-full-gc
AviatorEvaluator执行脚本导致Metaspace不足引发频繁 Full GC故障机经过 故障机经过 数据分析&特征平台DMP 最近频繁发生Full GC, 引发集群卡顿,导致经常超时,按照常规的方法,肯定是先看GC 日志 2020-02-17T10:17:...
一般Full GC时,机器的Load会升高,应用也会停止响应一会(持续长达几秒),如果应用一直频繁的进行FullGC,一方面会出现应用无法提供正常服务,另一方面甚至会导致应用崩溃址至挂掉。 所以观察应用的GC频率是可以...
一次jvm 老年代oom 的dump文件样例
SENSOR_GC1054的寄存器配置以及基本图像配置
FullGC的样例报告:包括因为元空间不足、频繁创建大量对象且堆空间较小导致的FullGC
GC9307是一个262,144色的单芯片SoC驱动器,用于TFT液晶显示器,分辨率为240rgbx320点,包括720通道源驱动,320通道栅极驱动,172800字节的图形显示240rgbx320点的数据和电源电路。 GC9307支持并行8-/9-/16-/18位...
GC2053 is a high quality 1080P CMOS image sensor, for security camera products, digital camera products and mobile phone camera applications. GC2053 incorporates a 1920H x 1080V pixel array, on-chip...
NULL 博文链接:https://lovewen-2004.iteye.com/blog/2427798
gc4023 datasheet
GC0308 MTK平台驱动,具体见附件, camera_sensor_GC0308.c camera_sensor_GC0308.h camera_info_GC0308.c camera_info_GC0308.h
GChisto及CMS GC相应补丁文件,补丁文件未亲测。 This patch adds the following features and improvements when using CMS GC in incremental mode: detecting Full GCs corrected parsing errors when using -XX:...
今天来谈谈C#的GC,也就是垃圾回收机制,非常的受教,总结如下 首先:谈谈托管,什么叫托管,我的理解就是托付C#运行环境帮我们去管理,在这个运行环境中可以帮助我们开辟内存和释放内存,开辟内存一般用new,内存是...