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

【JVM】HotSpot JVM内存管理和GC策略总结

阅读更多

JVM的相关知识是学习java高级特性必须要去深入学习的。平时也有一些学习和实践,不过总结比较少。

今天有时间总结一下最基础的内存模型和GC策略的知识,在此记录一下。

 

hotspot jvm内存模型

1.内存模型

hotspot的内存模型很多地方都有类似总结,我也简单总结了一下,大概可以用下图表示:



 关于几个分区的描述定义

1.线程栈:线程创建是会为每个线程创建一个线程栈,线程栈里面会为每个方法调用创建一个栈帧。主要用于保存线程的当前运行状态。

2.堆:用于存放运行时中生成的新对像。会划分成新生代和老年代。新生代里面又划分成了eden区、存活1区和存活2区。

3.永久区:方法和常量区,用于存放方法字节码元数据和各种常量。

 

为什么堆会划分为新生代和老年代?

基本原理:对于大部分应用,常驻对象不多。因为大部分存活寿命不长,新生代和老年代的划分有利于区分对待和缩小垃圾回收范围。(Most allocated objects are not referenced (considered live) for long, that is, they die young. Few references from older to younger objects exist.)

2.内存相关启动参数

 

内存相关常见jvm参数
参数 含义
-Xms 最小堆空间
-Xmx 最大堆空间
-Xmn 新生代空间
-Xss 线程栈空间
-XX:PermSize=xxx 永久代空间
-XX:MaxPermSize=xxx 最大永久代空间
-XX:SurviorRatio=xxx
代表eden:s0的比例
-XX:NewRatio=xx 新生代和旧生代的比例.
-XX:MaxTenuringThreshold。 在新生代最大存活次数

hotspot 内存垃圾回收策略总结

1.内存回收策略和常见概念

常见内存回收策略可以从以下几个维度来理解:

1.1 串行&并行
串行:单线程执行内存回收工作。十分简单,无需考虑同步等问题,但耗时较长,不适合多cpu。
并行:多线程并发进行回收工作。适合多CPU,效率高。
1.2 并发& stop the world
stop the world:jvm里的应用线程会挂起,只有垃圾回收线程在工作进行垃圾清理工作。简单,无需考虑回收不干净等问题。
并发:在垃圾回收的同时,应用也在跑。保证应用的响应时间。会存在回收不干净需要二次回收的情况。
1.3 压缩&非压缩&copy
压缩:在进行垃圾回收后,会通过滑动,把存活对象滑动到连续的空间里,清理碎片,保证剩余的空间是连续的。
非压缩:保留碎片,不进行压缩。

copy:将存活对象移到新空间,老空间全部释放。(需要较大的内存。)

 

一个垃圾回收算法,可以从上面几个维度来考虑和设计,而最终产生拥有不同特性适合不同场景的垃圾回收器。

2.HotSpot JVM的YGC&FGC

YGC :对新生代堆进行GC。频率比较高,因为大部分对象的存活寿命较短,在新生代里被回收。性能耗费较小。

FGC :全堆范围的GC。默认堆空间使用到达80%(可调整)的时候会触发FGC。以我们生产环境为例,一般比较少会触发FGC,有时10天或一周左右会有一次。

3.常见GC算法和jvm参数

3.1.串行垃圾收集器

新生代和老生代因为结构划分不一样,其串行收集器算法也不一样

新生代串行收集器

采用stop the world策略,步骤大概是:先从eden区扫描,把存活的对象拷贝到to区,如果to区放不下的对象直接拷贝到old区。再从from区扫描存活对象,如果对象存活次数超过阀值的就移到老年区,其他的移到to区。做完之后from和to区概念互换(from和to只是运行时的概念,其实就对应存活1区和存活2区)。

图形的表示如下:

回收前:


 

回收后:


 

老生代串行收集器

老生代垃圾回收主要分为三个阶段 Mark-sweep-compact

Mark :识别哪些是存活的
Sweep : 识别垃圾,并回收
Compact :滑动活动对象并压缩到连续空间,碎片整理

 

串行垃圾回收器在jvm client模式下是默认启动的。参数 -XX:+UseSerialGC 可以设置垃圾回收策略为串行。

 

3.2并行垃圾回收器

主要以下特点:

充分利用CPU
吞吐量优先
和串行一样,不过是多线程执行,缩短了stop-the-world时间。
-server模式下默认的回收器。参数 -XX:+UseParallelGC 可以设置垃圾回收策略为并行。

 

3.3并行压缩收集器(Parallel Compacting Collector)

只对老生代适用,新生代仍旧和并行垃圾回收器一样。

其过程大概如下:

标记阶段 ,使用多线程对存在引用的对象进行并行标记。
分析阶段 ,GC对各个区域进行分析,GC认为,在经过上次GC后,越左边的区域,有引用的对象密度要远远大于右边的区域。所以就从左往右分析,当某个区域的密度达到一个值的时候,就认为这是一个临界区域,所以这个临界区域左边的区域,将不会进行压缩,而右边的区域,则会进行压缩。
压缩阶段 ,多各个需要压缩的区域进行并行压缩

 

参数-XX:+UseParallelOldGC 可以设置老生代垃圾回收策略为并行压缩。

 

3.4 Concurrent Mark-Sweep (CMS) Collector

主要特点

仍旧是老生代适用。

减少停顿,以响应时间为优先。

只有标记和清除,不会进行会压缩。

初始标记和清除支持和应用程序并发执行,中间还是会有一re-mark需要stop the world。

 

参数-XX:+UseConcMarkSweepGC 可以设置老生代垃圾回收策略为CMS。

 

3.5 G1垃圾收集器

是在JDK7里支持的,用于取代CMS。具体具体见:http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

 

 

总结

本文的内容只是仅限于基础层面的的一些知识总结,更加深入的知识点还需要后续深入学习。

以下提供一些学习参考:

memory management whitepaper :

http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf

 

JVM option:http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html

 

淘宝的blue davy的一个jmm分享:  http://blog.bluedavy.com/?p=200

 

 

 

  • 大小: 28.6 KB
  • 大小: 26.5 KB
  • 大小: 22.4 KB
5
0
分享到:
评论
2 楼 demoxshiroki 2014-12-15  
咨询下,JVM 搞不搞class文件结构解析吗?GC,内存这些都是摸不着的东西,感觉jvm搞最好带像ASM这样的工具jar包,一起搞,这样可以比较清晰的认识CLASS文件结构,和opcode,以及operand吧..
1 楼 islove1945 2013-09-19  
很不错,言简意赅

相关推荐

    Sun JVM原理与内存管理

    ### Sun JVM原理与内存管理 #### 一、Sun JDK 1.6 GC (Garbage Collector) Sun JDK 1.6 的垃圾收集器(GC)是其内存管理的关键组成...通过合理的内存分配策略和恰当的 GC 调整,可以显著提高应用程序的性能和稳定性。

    JVM内存管理-GC模型-编写GC友好的代码

    JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧

    JVM内存管理-GC模型-编写GC友好的代码.pdf

    在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun Hotspot JVM 6的内存管理与GC模型,并介绍如何...

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    Java内存模型(JMM)规定了线程对共享变量的可见性和有序性,它通过主内存和工作内存的概念来实现多线程之间的协作。 3. JVM调优:JVM调优通常指对JVM进行配置,优化性能以应对特定的应用需求。常见的调优手段包括...

    JVM历史发展和内存回收笔记

    3. **Java 2 Platform, Standard Edition (J2SE)**:2000年,J2SE发布,引入了更多的JVM优化技术,如JIT编译器的进一步改进和内存管理的优化。 4. **Java 5.0与泛型**:2004年,Java 5.0引入了泛型、枚举、自动装箱...

    jvm 参数及gc详解

    - `-Xms` 和 `-Xmx`: 分别设置JVM初始堆内存和最大堆内存,确保应用在启动时和运行过程中有足够内存。 - `-Xss`: 指定每个线程的栈大小,影响线程创建和执行效率。 - `-Xmn`: 设置年轻代的大小,对新生代GC有直接...

    JVM_GC调优

    通过对JVM_GC调优的深入探讨,我们可以看出JVM内存管理和垃圾回收机制的复杂性。合理的GC策略和参数调整对于提高Java应用的性能至关重要。理解不同GC算法的特点和适用场景,可以帮助开发者选择最适合特定应用场景的...

    从JVM的内存管理角度分析Java的GC垃圾回收机制.docx

    HotSpot JVM的实现采用了Train GC算法,通过对象分组和分层,优先回收最老且访问频率较低的对象。 【finalize方法】 `finalize`是Java中Object类的一个受保护的方法,用于在对象被回收前执行一些清理工作。开发者...

    java中jvm内存分配相关资料总结整理

    本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个关键区域:方法区(Method Area)、堆(Heap)、栈(Stack)、程序计数器(PC ...

    JVM历史发展和内存回收笔记.rar

    总的来说,JVM作为Java语言的核心组成部分,其历史发展、运行时数据区域的管理以及内存回收机制是理解和优化Java应用程序性能的关键。理解这些知识点,有助于开发者编写出更高效、更稳定的代码。

    jvm相关代码仓库,包括类加载机制,字节码执行机制,JVM内存模型,GC垃圾回收,JV-jvm_practice.zip

    Java虚拟机(JVM)是Java程序运行的核心,它负责解析和执行字节码,管理内存,以及实现各种运行时特性。在这个名为"JV-jvm_practice.zip"的压缩包中,你将找到一系列关于JVM相关的代码示例,帮助你深入理解JVM的工作...

    实战Hot Spot JVM GC

    HotSpot虚拟机中的垃圾回收机制(GC)是JVM内存管理的核心部分。它包括多种策略,其中最常见的是Young Generation Collection(YGC,又称Minor GC)和Full GC(FGC)。YGC负责回收新生代内存中的对象,而FGC则会回收...

    HotSpot GC官网文档截图 - 20200917

    【HotSpot GC官网文档...这个文档集合对于深入理解Java垃圾收集机制,特别是HotSpot JVM中的GC工作原理和调优实践具有很高的参考价值。通过这些截图,开发者可以获得关于如何选择、配置和优化垃圾收集器的宝贵信息。

    Sun Hotspot V1.6.0 JVM GC PPT.pdf

    ### Sun Hotspot V1.6.0 JVM GC详解 #### 一、JVM结构与GC基础知识 ##### 1.1 JVM内存结构概述 Java虚拟机(JVM)内存主要分为以下几个部分: - **程序计数器(PC Register)**:记录当前线程所执行的字节码指令...

    JAVA-JVM-全面/发展史/GC.zip

    此外,GC的策略和算法也是重要知识点,包括复制算法、标记-清除算法、标记-整理算法和分代收集等。这些算法各有优缺点,适用于不同场景。例如,年轻代通常使用复制算法,而老年代可能采用标记-整理算法。 总之,这...

    JVM调优文档,自己总结汇总关于GC和性能的文章

    在JVM中,垃圾收集(GC)是自动管理内存的重要机制之一。本文将基于给定的资料,详细介绍JVM中的垃圾收集机制及其调优方法。 #### 垃圾收集(GC)概述 垃圾收集(Garbage Collection, GC)是JVM用于自动回收不再...

    JVM内存管理和垃圾回收参考.pdf

    Java虚拟机(JVM)内存管理和...总结来说,JVM内存管理和垃圾回收是一个复杂而精细的过程,涉及多种策略和算法,旨在高效利用内存,减少应用暂停时间,并防止内存泄漏。理解和掌握这些原理对优化Java应用性能至关重要。

    JVM体系结构与GC调优

    Java虚拟机(JVM)是Java程序运行的基础,它的体系结构和垃圾收集(GC)调优对于优化Java应用性能至关重要。本PPT深入探讨了这两个关键主题,旨在帮助开发者理解和提升应用程序的运行效率。 首先,JVM是一个抽象的...

Global site tag (gtag.js) - Google Analytics