`

java 虚拟机--新生代与老年代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:...

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(program counter)寄存器。

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

 

GC (minor )日志
Full GC 日志
-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8 -XX:-HandlePromotionFailure -XX:+PrintHeapAtGC -XX:+PrintGCTimeStamps
-XX:+PrintGCDetails -XX:+PrintTenuringDistribution
分享到:
评论

相关推荐

    java虚拟机

    是垃圾收集的主要区域("GC 堆"),现代的垃圾收集器基本都是采用分代收集算法,该算法的思想是针对不同的对象采取不同的垃圾回收算法,因此虚拟机把 Java 堆分成以下三块: - 新生代(Young Generation) - 老年代...

    Android面试(一)Java虚拟机内存结构分析

    JVM堆:所有线程共享的运行时内存区域,是GC回收的主场所,Java堆保存Java的实例对象,从内存回收对象的存活来分析,堆又可以分为新生代、老年代。 方法区:方法区是线程共享的运行时内存区域,存储虚拟机加载的类的...

    JAVA架构知识库整理 JAVA架构知识 Java架构师 Java 架构师必备

    老年代.2.3.3. 永久代2.3.3.1. JAVA8 与元数据.2.4. 垃圾回收与算法2.4.1. 如何确定垃圾2.4.1.1. 引用计数法.2.4.1.2. 可达性分析.2.4.2. 标记清除算法(Mark-Sweep)2.4.3. 复制算法(copying)2.4.4. 标记整理算法...

    性能调优+JVM详解+JVM核心参数

    垃圾回收和内存调优:新生代和老年代的垃圾回收参数调优。 代码缓存:调整代码缓存大小和解决溢出问题的参数。 并行垃圾回收器:设置和优化多线程并行GC。 CMS垃圾回收器:CMS垃圾回收器的参数和调优策略。 适用人群...

    Java GC的那些事(1)

    前言  与C语言不同,Java内存...为了进行高效的垃圾回收,虚拟机把堆内存划分成新生代(Young Generation)、老年代(Old Generation)和代(Permanent Generation)3个区域。  新生代  新生代由 Eden 与 S

    JAVA面试核心知识点283页

    1.目录 1 2.JVM 19 2.1. 线程 20 2.2.JVM 内存区域 21 ...2.3.2.老年代 25 2.3.3.永久代 25 2.3.3.1.JAVA8 与元数据 25 2.4.垃圾回收与算法 26 2.4.1.如何确定垃圾 26 2.4.1.1.引用计数法 26 2.4.1.2

    重磅2023年最新JAVA核心知识整理从基础到精通完整教程-283页全面试题解析学习资料涵项目源码-20231120.pdf

    2.3.3.1.JAVA8与元数据 2.4.垃圾回收与算法 2.4.1.如何确定垃圾 2.4.1.1.引用计数法 2.4.1.2.可达性分析 2.4.2.标记清除算法(Mark-Sweep) 2.4.3.复制算法(copying) 2.4.4.标记整理算法(Mark-Compact) 2.4.5.分代...

    JVM参数设置详细说明

    后来我们就用CMS gc(-XX:+UseConcMarkSweepGC),当时的总heap还是3g,新生代1.5g后,观察不是很理想,改为jvm heap为2g新生代设置-Xmn1g,在这样的情况下young gc发生的频率变成7、8秒一次,平均每次时间40-50毫秒...

    JAVA核心知识点整理_美团十年.rar

    2.3.2. 老年代 .......................................................................................................................................... 25 2.3.3. 永久代 .................................

    java核心知识点整理.pdf

    老年代 .......................................................................................................................................... 25 永久代 ..............................................

    JAVA核心知识点整理(有效)

    老年代 .......................................................................................................................................... 25 永久代 ...............................................

Global site tag (gtag.js) - Google Analytics