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):
-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: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. 开启GC调试后运行结果解释
开启方法,在vm options设置-verbose:gc
运行程序会打印如下日志信息:
[GC (Allocation Failure) [PSYoungGen: 7621K->712K(9216K)] 7621K->6864K(19456K), 0.0029348 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (Ergonomics) [PSYoungGen: 712K->0K(9216K)] [ParOldGen: 6152K->6744K(26624K)] 6864K->6744K(35840K), [Metaspace: 3030K->3030K(1056768K)], 0.0048131 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] [PSYoungGen: 7168K->7168K(9216K)] [ParOldGen: 30295K->30276K(30720K)] 37464K->37444K(39936K), [Metaspace: 3091K->3091K(1056768K)], 0.0070226 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
相关推荐
Java虚拟机(JVM)是Java...总的来说,理解JVM的垃圾回收机制和内存分配策略对于编写高效、稳定的Java应用至关重要。开发者需要根据具体的应用场景选择合适的垃圾回收器,并进行适当的参数调整,以实现最佳的性能表现。
JVM的垃圾回收机制是Java性能优化的关键,理解不同阶段和区域的内存分配、选择合适的垃圾收集器以及合理调整参数,可以有效提高系统性能,减少应用停顿时间,从而提升用户体验。对于大型分布式系统,深入理解JVM的GC...
垃圾回收的参数调整是JVM调优的重要部分,包括设置堆大小、新生代与老年代的比例、选择合适的垃圾收集器等。通过合理的配置,可以优化应用程序的性能,避免因垃圾回收导致的系统响应慢或者频繁Full GC等问题。 总之...
本文将深入探讨JVM垃圾回收器的工作原理,并通过实例来帮助开发者理解和应用。 1. 垃圾回收概述 - 内存管理:Java中的内存分为堆内存和栈内存,垃圾回收主要针对堆内存。 - 对象生命周期:创建、使用、不再引用...
JVM提供了丰富的参数来调整垃圾回收行为,如`-Xms`和`-Xmx`设置堆内存大小,`-XX:NewRatio`控制新生代和老年代的比例,`-XX:SurvivorRatio`设定新生代Eden区和Survivor区的比例,以及`-XX:+UseConcMarkSweepGC`启用...
JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。
Java虚拟机(JVM)是Java程序的核心,它负责管理程序的运行时环境,包括...通过调整JVM参数,优化垃圾回收策略,可以显著提升应用的性能和稳定性。对于Java程序员而言,深入理解这些概念和原理是提升技术水平的关键。
理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...
开发者需要根据不同的应用场景和需求,对JVM进行合理配置,比如调整堆大小、选择合适的垃圾回收器、进行内存泄漏检测等。 7. 跨平台原理:JVM作为Java的跨平台核心,使得Java程序在不同的操作系统和硬件平台上都...
为了监控和优化JVM的垃圾回收,开发者可以使用如VisualVM、JConsole、JMX等工具,通过观察内存分配、垃圾回收日志、GC停顿时间等指标来调整JVM参数,比如设置最大堆大小、年轻代和老年代的比例、GC算法选择、晋升...
《JVM规范与深入理解》这个主题涵盖了Java虚拟机(Java Virtual Machine)的全面解析,旨在帮助开发者深入了解JVM的工作原理及其对程序性能的影响。在这个主题中,我们主要关注两个核心资源:周志明的《深入理解Java...
本节将深入探讨JVM垃圾回收机制以及与之相关的工具和概念。 1. **JVM内存模型** JVM内存分为堆内存和栈内存,其中堆内存主要用于存储对象实例,而栈内存则用于存储方法调用时的局部变量。堆内存又分为年轻代和老...
本主题将深入探讨JDK中的重要工具、JVM(Java Virtual Machine)的垃圾回收机制以及23种经典的设计模式。 首先,JDK工具介绍: 1. `javac`:这是Java的编译器,用于将源代码编译成可执行的字节码。 2. `java`:这个...
5. **GC日志分析**:通过分析JVM产生的GC日志,可以了解垃圾回收的效率和内存使用情况,从而调整参数以优化性能。 6. **内存泄漏检测**:关注长期未被释放的对象,可能暗示存在内存泄漏问题。开发者可以通过工具如...
本文将深入讲解JVM内存分配、回收策略以及对象的判断和回收方法。 1. **JVM内存分配与回收** 在JVM内存模型中,堆内存被分为新生代和老年代。新生代又进一步划分为Eden区和两个Survivor区(From Space和To Space...
本篇文章将深入探讨JVM中的垃圾回收机制及其各种回收器。 1. **基本概念** - **内存区域划分**:JVM内存主要分为堆(Heap)、栈(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器...
《深入理解JVM性能调优和内存模型,垃圾回收,虚拟机原理,经典视频教程》是一套详尽的教育资源,旨在帮助Java开发者深入探索Java虚拟机(JVM)的内部工作机制,提升性能优化的能力。本教程共包含110讲,内容丰富,适合...
本文将深入探讨JVM垃圾回收的基本过程,主要包括三个关键步骤:枚举根节点、标记和清除/回收。 1. **枚举根节点** 在垃圾回收开始时,首先要确定哪些对象是仍然在使用的,即GC Roots。这些对象包括: - 虚拟机栈...
总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1 GC的深入见解,有助于Java开发者更好地理解和控制JVM的内存管理,提升应用程序的稳定性和效率。通过学习这些知识,开发者可以解决实际开发中...