`
zorufa876
  • 浏览: 82722 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

探究JVM和GC(转)

阅读更多

最近研发部门把系统的稳定性放在了工作的首位,大家都在为此做努力。回想自己在做的项目,有些是没有性 能测试这个环节的,如何保证系统的稳定性呢?我想只能开发自己做性能测试了。性能测试涉及的知识面比较广,包括要了解内存区域划分、GC回收机制、JVM 的参数设置,性能监控分析工具的使用,监测数据的分析等。先把JVM和GC的基础知识总结一下,温故而知新。

1 Java 堆中各代分布

heap

图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)

GC

图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:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-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 (运行时数据区):

 JVM1

图3:JVM运行时数据区(一)

Heap: JVM只有一个为所有线程所共享的堆,所有的类实例和数组都是在堆中创建的。

Method area: JVM只有一个为所有的线程所共享的方法区。它存储类结构,例如运行时常量池,成员和方法数据以及方法、构造方法的代码。

Java Stacks: 每个JVM线程拥有一个私有的栈。

Pc registers: JVM可以同时支持运行多个线程,因此每个线程需要各自的PC(program counter)寄存器。

Native method stacks: 保存native方法进入区域的地址 。

 JVM2

图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

分享到:
评论

相关推荐

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...

    33、JVM探究.pdf

    【JVM探究】 Java虚拟机(JVM)是Java编程语言的核心组成部分,它负责执行Java程序,提供了一个跨平台的运行环境。理解JVM的工作原理对于优化Java应用程序性能至关重要。以下是一些关于JVM的关键知识点: 1. **JVM...

    JVM原理.pdf

    垃圾回收(Garbage Collection,GC)是JVM内存管理的一部分,它自动释放不再使用的对象占用的内存空间,以防止内存泄漏和内存溢出。常见的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法和分代收集算法等...

    monkey老师的jvm 调优

    Monkey老师的JVM调优课程,无疑为我们提供了一个宝贵的平台,来深入探究JVM的工作原理及其优化技巧。下面,我们就一起来深入学习Monkey老师关于JVM调优的核心知识点。 首先,我们要明白JVM的重要性。它是Java程序...

    深入浅出jvm虚拟机视频大全(jvm性能调优+内存模型+虚拟机原理)

    使用JVisualVM、JConsole等工具监控JVM的运行状态,定期检查GC日志,分析对象的创建和销毁情况,从而找出性能瓶颈并针对性地进行优化。例如,JVisualVM提供了丰富的监控功能,可以帮助开发者深入了解JVM的内存使用...

    垃圾回收系列(3):CLR与JVM垃圾回收器的比较扫描.pdf

    在本篇文章中,我们将对比CLR和JVM的垃圾回收机制,从分代机制、回收模式、回收算法到查找存活对象的技术,深入探究它们之间的异同。 分代式垃圾回收是CLR和JVM的共同策略。该策略基于“弱代假设”,即大多数对象的...

    jvm理解pdf

    《深入理解Java虚拟机:JVM高级特性与最佳实践》这本书是Java开发者深入探究JVM(Java Virtual Machine)的重要参考资料。JVM作为Java程序运行的基础,它的理解和优化对于提升Java应用性能至关重要。以下将详细阐述...

    解决JVM实际使用的内存比-Xmx的少的问题.docx

    ### 解决JVM实际使用的内存比-Xmx设置的值小的问题 #### 一、问题背景与初步探索 本文旨在探讨并解决一个常见的Java...通过合理选择GC算法、调整JVM参数等方式,可以有效解决这一问题,提高程序的性能和稳定性。

    Java开发必备:深入探讨JVM架构、内存管理和垃圾回收机制

    内容概要:本文详尽讲解了JVM的相关知识点,主要包括运行时内存结构、对象与内存溢出、GC算法及优化、class文件格式、类加载过程及其加载器工作机制。文中详细拆解了堆与栈的结构特性,阐述不同类型的内存溢出原因,...

    jvm 深入讲解

    同时,JVM还提供了多种GC类型,如Serial、Parallel、CMS和G1等。 5. **内存溢出与泄露**:了解如何识别和解决内存溢出(OOM)问题非常重要。常见的溢出类型包括堆溢出、栈溢出和方法区溢出。内存泄露通常由于对象...

    AndroidGC原理探究UI

    导语想写一篇关于androidGC的想法来源于追查一个魅族手机图片滑动卡顿问题,由于不断的GC导致的丢帧卡顿的问题让我们想了很多方案去解决,所以就打算详细的看看内存分配和GC的原理,为什么会不断的GC,GCALLOC和...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码  第1讲 说在前面的话 免费 00:05:07  第2讲 整个部分要讲的内容说明 免费 00:06:58  第3讲...

    GCT代码

    4. **源码分析**:通过阅读和理解JVM的GCT源码,深入探究其工作流程和决策机制。 5. **性能工具**:学习使用JVM提供的监控工具(如JConsole、VisualVM等),以及专门的性能分析工具(如JProfiler、YourKit),进行...

    探究C语言和Java语言中垃圾回收的不同方式.pdf

    两种语言在垃圾回收(Garbage Collection,GC)机制上也表现出了截然不同的实现方式。 C语言的垃圾回收方式 C语言没有内建的垃圾回收机制,这是因为它主要是用指针来进行内存的分配与释放。在C语言中,程序员需要...

    2019互联网面试题第2季.mmap.zip

    2. **对象创建与内存分配**:探究对象在JVM中的创建过程,了解新生代、老年代、持久代的内存分配策略。 3. **类加载机制**:分析类加载的双亲委派模型,理解类加载器的层次结构和自定义类加载器的实现。 4. **JVM...

    圣思园张龙java开发进阶视频网盘.txt

    通过以上内容的学习,我们可以看到Java开发进阶不仅仅是对语言本身的理解,更重要的是对其实现原理和技术细节的深入探究。无论是多线程还是JVM,都涉及到大量复杂的概念和技术点。掌握这些知识不仅能够帮助我们写出...

    openjdk-8u40-src-b25-10_feb_2015

    1. **JVM架构**:了解HotSpot JVM的工作原理,包括解释器、编译器(C1和C2)、垃圾收集器(如Parallel GC、G1 GC)等。 2. **Java编译过程**:从源码到字节码,再到机器码的转换过程,以及JIT编译的动态优化策略。 ...

    百度2014校园招聘笔试试题-技术类软件研发.doc

    面试是评估候选人在技术岗位上潜在能力的关键环节,尤其在知名公司如百度的校园招聘中,面试官会深入探究候选人的技术基础和解决问题的能力。以下将针对提供的部分面试题目进行详细解答: 1. **如何实现一个JVM** ...

    java-jdk源码学习

    JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、编译器(javac)、JVM(Java虚拟机)和其他开发工具。源码学习则是对这些组件内部实现的探究。 1. **Java编译器(javac)** - ...

Global site tag (gtag.js) - Google Analytics