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.内存相关启动参数
参数 | 含义 |
-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:将存活对象移到新空间,老空间全部释放。(需要较大的内存。)
一个垃圾回收算法,可以从上面几个维度来考虑和设计,而最终产生拥有不同特性适合不同场景的垃圾回收器。
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
相关推荐
JVM内存管理的介绍,编写GC友好的代码。 本材料主要关心 Sun Hotspot JVM 6的内存管理 Sun Hotspot JVM 6的GC模型 主要针对JVM6的GC模型,但也会简单介绍Java 7的G1 编写GC友好代码的一些技巧
jvm 结构介绍、GC相关知识总结
介绍Sun HotSpot和JRockit JVM堆内存输出和分析工具,经典GC策略原理等。
JVM演讲PPT分享,JVM PPT的演进文稿分享,JVM体系结构,GC算法
官网英文文档介绍GC的各个版本发展、GC选取、调优参数等; 当前压缩包为官网文档截图文件集合,个人觉得资源珍贵且比网上各个帖子更有参考价值,故存储自用并分享。
JVM运行时内存分区 程序计数器 程序计数器的特点 Java虚拟机栈 栈帧 局部变量表 操作数栈 动态连接 方法出口 本地方法栈 堆 方法区 JavaVirtualMachineError StackOverflowError OutOfMemoryError JVM PS:JVM部分...
不过常用的jvm都有gc,而且大多数gc都使用类似的算法管理内存和执行收集操作。 在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能。有些垃圾收集专用于特殊的应用程序。比如,实时应用程序主要是为了...
HotSpot的垃圾回收机制采用分代回收,堆分为年轻代和老年代,非堆就是持久带。面对不同的代,采用不同的回收策略。 而年轻代又可以分为1个Eden和2个Survivor。对于Eden,大多数对象都是先在此区域开辟空间,存储年轻...
能学到什么:1,JVM底层运行机制和原理;2JVM参数;3,垃圾回收原理;4,垃圾回收器的使用;5,调优实战案例 导语:平时我们所说的JVM广义上指的是一种规范。狭义上的是JDK中的JVM虚拟机。JVM的实现是由各个厂商来做...
公司内部分享的ppt,主要内容:1)Java发展史概述 2)JVM内存模型 3)GC算法 4)HotSpot内存管理 5)垃圾收集器 6)JVM调优
Sun是一家伟大的公司,在C ++时代,他们创建了JVM&HotSpot。 现在,我们有了Rust,一个更好的工具,让我们重新制作JVM! 向前面的医务人员致敬! 感谢您为抗击流行病做出的贡献。 路线图 通过JDK中的测试用例 ...
在 HotSpot 虚拟机中,分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)对象头(Header):包含两部分,第一部分用于存储对象自身的运行时数据,如哈希码、GC 分代年龄、锁状态标志、线程...
资源描述: 1.JVM与Java体系结构-xmind脑图 2.资源内容:JVM与Java体系结构 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开
资源描述: 1.HotSpot虚拟机对象探秘-xmind脑图pdf 2.资源内容:HotSpot虚拟机对象探秘 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开
实际问题OOM内存不足问题GC问题(阅读GC日志) 配置/优化JVM参数目标内存管理和GC 字节码和类加载器JVM参数配置和优化CS核心基金会硬件网络操作系统DS /算法虚拟机类别物理硬件的系统VM(例如:Virtual Box,VMware...
JVM 知识点整理:GC垃圾收集器判断哪些对象需要回收引用计数器算法可达性分析算法引用还有分类(了解)“缓刑” finalize(了解)开始垃圾收集标记 – 清除算法复制算法标记 – 整理算法分代收集算法HotSpot 算法...
Java虚拟机实质原理知识总结这里仅仅记录了一些笔者认为需要重点掌握的JVM知识点,如果你想更全面地了解JVM逐步原理,可以阅读周志明老师《深入理解Java虚拟机——JVM高级特性与最佳实践(第2/3版)》全书。...
java7 rt.jar源码 Java_JVM This is my Java JVM learn notes JVM: ...一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 ...上篇——内存与垃圾回收器 ...jvm依赖的架构: ...HotSpot JVM 特点: 热点代码探索
*用来做同步和GC >同样的如果之前计算过,就缓存hashcode *markWord的低位2个字节用来存储同步状态 >01 => unlocked >00 => light-weight locked >10 => heavy-weight locked >11 => marked for GC ...