`
zhangsibei
  • 浏览: 15653 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

JVM系列二

    博客分类:
  • JVM
阅读更多

 

JVM系列二:GC策略&内存申请、对象衰老

       JVM里的GC(Garbage Collection)的算法有很多种,如标记清除收集器,压缩收集器,分代收集器等等,详见HotSpot VM GC 的种类

       现在比较常用的是分代收集(generational collection,也是SUN VM使用的,J2SE1.2之后引入),即将内存分为几个区域,将不同生命周期的对象放在不同区域里:young generationtenured generation和permanet generation。绝大部分的objec被分配在young generation(生命周期短),并且大部分的object在这里die。当young generation满了之后,将引发minor collection(YGC)。在minor collection后存活的object会被移动到tenured generation(生命周期比较长)。最后,tenured generation满之后触发major collection。major collection(Full gc)会触发整个heap的回收,包括回收young generation。permanet generation区域比较稳定,主要存放classloader信息。

       young generation有eden、2个survivor 区域组成。其中一个survivor区域一直是空的,是eden区域和另一个survivor区域在下一次copy collection后活着的objecy的目的地。object在survivo区域被复制直到转移到tenured区。

       我们要尽量减少 Full gc 的次数(tenured generation 一般比较大,收集的时间较长,频繁的Full gc会导致应用的性能收到严重的影响)。

堆内存GC
       JVM(采用分代回收的策略),用较高的频率对年轻的对象(young generation)进行YGC,而对老对象(tenured generation)较少(tenured generation 满了后才进行)进行Full GC。这样就不需要每次GC都将内存中所有对象都检查一遍。

非堆内存不GC

      GC不会在主程序运行期对PermGen Space进行清理,所以如果你的应用中有很多CLASS(特别是动态生成类,当然permgen space存放的内容不仅限于类)的话,就很可能出现PermGen Space错误。

内存申请、对象衰老过程
一、内存申请过程

  1. JVM会试图为相关Java对象在Eden中初始化一块内存区域;
  2. 当Eden空间足够时,内存申请结束。否则到下一步;
  3. JVM试图释放在Eden中所有不活跃的对象(minor collection),释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
  4. Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
  5. 当old区空间不够时,JVM会在old区进行major collection;
  6. 完全垃圾收集后,若Survivor及old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现"Out of memory错误";

二、对象衰老过程

  1. 新创建的对象的内存都分配自eden。Minor collection的过程就是将eden和在用survivor space中的活对象copy到空闲survivor space中。对象在young generation里经历了一定次数(可以通过参数配置)的minor collection后,就会被移到old generation中,称为tenuring。
  2. GC触发条件
    GC类型 触发条件 触发时发生了什么 注意 查看方式
    YGC eden空间不足

    清空Eden+from survivor中所有no ref的对象占用的内存
    将eden+from sur中所有存活的对象copy到to sur中
    一些对象将晋升到old中:
        to sur放不下的
        存活次数超过turning threshold中的
    重新计算tenuring threshold(serial parallel GC会触发此项)

    重新调整Eden 和from的大小(parallel GC会触发此项)

    全过程暂停应用
    是否为多线程处理由具体的GC决定
    jstat –gcutil 
    gc log
    FGC

    old空间不足
    perm空间不足
    显示调用System.GC, RMI等的定时触发
    YGC时的悲观策略
    dump live的内存信息时(jmap –dump:live)

    清空heap中no ref的对象
    permgen中已经被卸载的classloader中加载的class信息

    如配置了CollectGenOFirst,则先触发YGC(针对serial GC)
    如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC)

    全过程暂停应用
    是否为多线程处理由具体的GC决定

    是否压缩需要看配置的具体GC
    jstat –gcutil 
    gc log
    permanent generation空间不足会引发Full GC,仍然不够会引发PermGen Space错误。

参考:

http://jiangyongyuan.javaeye.com/blog/356502

http://www.helloying.com/blog/archives/164

分享到:
评论

相关推荐

    JVM系列之性能调优参考手册(实践篇).pdf

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...

    JVM基础系列

    ### JVM基础系列——深入了解Java虚拟机的重要性 #### 一、引言 随着Java技术的不断发展,Java虚拟机(JVM)已成为软件开发人员不可或缺的核心技能之一。对于初学者而言,掌握JVM的基础知识不仅可以帮助深入理解Java...

    JVM指令手册详细完整版.pdf

    二、const系列 const系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。例如iconst_m1命令将int型(-1)推送至栈顶,iconst_0命令将int型(0)推送至栈顶,以此类推。 三、push系列 push系列命令负责把...

    JVM中文指令手册.pdf

    1. JVM指令类型:JVM指令可以分为不同类型,包括将常量推送到操作数栈的指令(const系列指令),以及用于将单个数值(如int、long、float、double)推送到操作数栈的指令(iconst系列、lconst系列、fconst系列、d...

    jvm 详细介绍,了解jvm各个组成部分和功能

    #### 二、JVM 的结构 ##### 2.1 JVM 指令系统 JVM 指令系统是指虚拟机所支持的一系列操作指令,这些指令用于实现 Java 程序的各种功能。虽然理论上可以支持 256 条指令,但目前常用的指令集大约有 160 条左右。JVM...

    小菜鸟系列-JVM体系结构

    **小菜鸟系列-JVM体系结构** Java虚拟机(JVM)是Java平台的核心组成部分,它为Java程序提供了跨平台的运行环境。理解JVM的体系结构对于优化代码性能、排查故障以及深入理解Java编程至关重要。在本文中,我们将探讨...

    狂神说JVM探究.rar

    这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键知识点的详细解析: 1. **JVM概述**: - JVM是Java平台的核心组成部分,它是一个运行Java字节...

    慢慢琢磨jvm 经典

    这一过程涉及JVM的内部指令集,类似于不同CPU系列的汇编语言,但具有跨平台兼容性。 #### 存储管理:内存中的虚拟世界 JVM的存储部分尤为重要,尤其是对于程序的健壮性和效率而言。与硬盘存储无关,JVM的存储机制...

    JVM系列之一[类文件结构].docx

    《JVM系列之一:深入理解类文件结构》 Java虚拟机(JVM)是Java程序的核心执行环境,它负责解释和执行字节码。本文将详细剖析JVM中的类文件结构,这是理解Java程序运行机制的基础。 首先,每个Java源代码文件编译...

    JVM课件(云析学院JVM课程课件)

    在上述提供的文件信息中,我们看到一系列关于Java虚拟机(JVM)的知识点。文件主要包括一个链接指向视频资源、云析学院的讲师信息、以及课件的主要内容概要。内容概要被分为三个部分:基础篇、高级篇和优化篇,并...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    JVM基础.doc

    **JVM指令集** 包含了一系列操作码,用于控制Java程序的执行。例如,`aload_0`用于加载对象引用到栈顶。 **并发程序设计** 需要注意: - **锁机制**:保证了对共享资源的正确访问。 - **缓存一致性**:基于MESI协议...

    java基础之JVM

    2. **JVM内存结构**:主要包括堆、栈、方法区等,用于存储和管理数据。 3. **GC(Garbage Collection)算法**:自动内存管理机制,用于回收不再使用的对象所占用的内存空间。 4. **GC分析命令调优**:用于监控和优化...

    JVM指令手册_jvm指令手册_

    1. **操作数栈管理指令**:JVM中的每条指令都可能涉及到操作数栈的操作,如`iconst`系列用于将整数值压入栈,`pop`和`pop2`用于弹出栈顶元素,`dup`用于复制栈顶元素并将其推回栈顶。 2. **局部变量表操作指令**:...

    JVM监控工具使用入门

    为了更好地理解和优化JVM的运行状态,开发人员需要掌握一系列的监控工具和技术。本文将详细介绍JDK自带的一些强大的JVM监控工具,包括jconsole、jvisualvm以及Oracle JRockit Mission Control (JRMc),并指导如何...

    visualvm监控jvm及远程jvm监控方法

    它集成了一系列功能,如内存分析、线程检查、CPU消耗监控、类加载和垃圾收集等,使得开发者能够深入了解应用在JVM上的运行状况。在本文中,我们将详细探讨如何使用VisualVM来监控本地和远程的JVM实例。 1. **...

    JVM 原理及工作机制

    - **字节码指令集**:Java源代码在编译后生成的是字节码,这是一种平台无关的中间表示,由一系列的16进制数字组成,对应JVM的一系列指令。 - **寄存器**:JVM使用一组逻辑上的寄存器进行运算,这些寄存器并不对应...

    深入JVM内核—原理、诊断与优化

    2. **字节码与类加载**:JVM通过类加载器动态加载Java类,将.class文件转换为运行时的数据结构。字节码的解析和执行由解释器和即时编译器(如HotSpot的C1和C2编译器)共同完成,实现解释执行与编译执行的混合模式。 ...

    monkey老师的jvm 调优

    4. **性能监控与分析**:JVM提供了一系列工具,如JConsole、VisualVM和JProfiler,用于实时监控JVM状态,分析CPU、内存、线程等资源使用情况,找出性能瓶颈。例如,`-XX:+HeapDumpOnOutOfMemoryError`参数可在内存...

    idea插件JVM内存工具JProfiler11

    IntelliJ IDEA(简称Idea)作为广受欢迎的Java集成开发环境,提供了一系列强大的工具来帮助开发者进行性能调优,其中就包括JProfiler11这款强大的JVM内存分析工具。本文将详细介绍如何使用Idea中的JProfiler11插件,...

Global site tag (gtag.js) - Google Analytics