速记JVM内存模型和垃圾回收策略
一、常用JVM参数
-Xms: 初始堆大小
-Xmx: 最大堆
-Xmn: 新生代大小
-Xss: 栈容量
-PermSize: 方法区大小
-MaxPermSize: 最大方法区大小
-MaxDirectMemorySize: 最大直接内存大小
二、java虚拟机基本结构

.PC寄存器(程序计数器):线程私有的,记录的是正在执行的虚拟机字节码指令的地址。
.java栈(虚拟机栈):线程私有的,每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法的调用到完成对应入栈到出栈的过程。
.本地方法栈:线程私有的,为native方法服务。
.java堆:线程共享的,用于存放对象实例。从内存回收的角度看,分为新生代(eden、from、to)和老年代;从内存分配的角度看,java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。
.方法区(永久代):线程共享的,用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。GC行为比较少,主要针对常量池的回收和对类型的卸载。
5.1 运行时常量池:是方法区的一部分,用于存放编译期生成的字面量和符号引用。
.直接内存:不受java堆大小的限制,直接申请系统的物理内存。
三、垃圾回收策略
主要针对堆区进行回收,方法区收集效率很低。
3.1 垃圾收集算法
3.1.1 标记-清除算法
主要用于老年代,首先标记出所有需要回收的对象,然后统一回收。
优点:简单
缺点:标记和清除的效率都不高,而且会产生大量的内存碎片。
3.1.2 复制算法
将内存分为大小相等的两块,每次只使用一块。当这一块内存用完了,就把存活的对象复制到另一块上,然后清除这一块。
主要用于新生代,把新生代按8::1的比例分,edan区分80%,from存活区和to存活区分10%。回收时,将edan和from(to)中存活的对象一次性复制到to(from)中,然后清理掉,如果存活区空间不足,就分配到老年代。
3.1.3 标记-整理算法
主要用于老年代,标记过程与“标记-清除”算法一样,为解决内存碎片的问题,后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都像一端移动,然后直接清理掉端边界以外的内存。
3.2 垃圾收集器
3.2.1 Serial(串行)收集器
单线程,串行,用于新生代,使用复制算法,运行在Client模式下。
优点:简单高效。缺点:它进行垃圾回收时,必须暂停其他所有的工作线程,直到收集结束。
3.2.2 Serial Old收集器
单线程,串行,用于老年代,使用标记整理算法,运行在Client模式下。
优点:简单高效。缺点:它进行垃圾回收时,必须暂停其他所有的工作线程,直到收集结束。
如果在Server模式下,它可以和Parallel Scavenge收集器搭配使用;还可以作为CMS收集器的后备预案,在并发收集发生Concurrent Model Failure 时使用。
3.2.3 ParNew收集器
用于新生代,其实就是Serial的多线程版本,它第一次实现了让垃圾收集线程和用户线程(基本上)同时工作,运行在Server模式下。但在单CPU环境下不如Serial。
3.2.4 Parallel(并行) Scavenge(打扫)收集器
用于新生代,使用复制算法,多线程,和ParNew类似。但是它的关注点是吞吐量【吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)】,其他收集器的关注点是缩短垃圾收集时用户线程的停顿时间。-XX:MaxGCPauseMillis控制最大垃圾收集停顿时间,-XX:GCTimeRatio设置吞吐量的大小
3.2.5 Parallel Old收集器
是 Parallel Scavenge收集器的老年代版本,多线程,使用“标记-整理”算法。
在注重吞吐量以及CPU资源敏感的场合,可以优先考虑Parallel Scavenge和Parallel Old搭配使用。
3.2.6 CMS收集器
目的是获取最短回收停顿时间 ,使用标记-清除算法。运作过程分为1.初始标记(STW);.并发标记;.重新标记(STW);.并发清除。
优点:并发收集、低停顿
缺点:
.因为是并发设计的,所以当CPU不足时,效率会不高;
.由于并发清理阶段,用户线程还在产生垃圾,所以在jdk1.5中,CMS在老年代使用了68%时被激活,jdk1.6中,是92%。要是CMS运行期间内存不足,就会出现“Concurrent Mode Failure”失败,这时虚拟机会启用Serial Old来重新收集,这样停顿时间会更长了。
. 因为是基于“标记-清除”算法,会有大量空间碎片。为了解决这个问题,CMS提供了碎片合并整理过程,但停顿时间更长了。
3.2.7 G1收集器
G1是一款面向服务端应用的垃圾收集器。
特点:并发和并行、分代收集、空间整合、可预测的停顿
运作步骤:初始标记、并发标记、最终标记、筛选回收
使用G1时,它将整个java堆划分为多个大小相等的独立区域(Region),新生代和老年代不再是物理隔离了,他们都是一部分Region的集合。G1跟踪各个Region里面的垃圾堆积的价值大小,优先回收价值最大的Region。
jdk7 默认Parallel Scavenge(新生代)+ Parallel Old(老年代)
jdk8 默认Parallel Scavenge(新生代)+ Parallel Old(老年代)
jdk9 默认G1
-XX:+PrintCommandLineFlagsjvm参数可查看默认设置收集器类型
-XX:+PrintGCDetails可通过打印的GC日志的新生代、老年代名称判断
四、内存分配
.对象优先在Eden分配,当eden内存不足时,系统会发起一次Minor GC。经过一轮GC 后,对象会进入Survivor区,当Survivor区不足时,对象会直接分配到老年代。
.大对象直接进入老年代。
.长期存活的对象将进入老年代。在新生代,每经过一次GC,对象的年龄就加1,当加到15(默认值)时,就进入老年代。
速记JVM内存模型和垃圾回收策略的更多相关文章
- JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集
(转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...
- 程序猿的日常——JVM内存模型与垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础--这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- JVM内存模型和垃圾回收
Java开发有个很基础的问题,虽然我们平时接触的不多,但是了解它却成为Java开发的必备基础——这就是JVM.在C++中我们需要手动申请内存然后释放内存,否则就会出现对象已经不再使用内存却仍被占用的情 ...
- 【Java_基础】JVM内存模型与垃圾回收机制
1. JVM内存模型 Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示 1.1 程序计数器 程序计数器( ...
- JVM内存模型以及垃圾回收
JAVA堆的描述如下: 内存由Perm和Heap组成.其中Heap = {Old + NEW = { Eden , from, to } } JVM内存模型中分两大块: NEW Generation: ...
- JVM内存模型,垃圾回收算法
JVM内存模型总体架构图 程序计数器多线程时,当线程数超过CPU数量或CPU内核数量,线程之间就要根据时间片轮询抢夺CPU时间资源.因此每个线程有要有一个独立的程序计数器,记录下一条要运行的指令.线程 ...
- JVM内存模型及垃圾回收算法
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- JVM 内存模型及垃圾回收
java内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器:程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说 ...
- JVM内存模型及垃圾回收的研究总结
Java内存模型 总的来说就分为两个区域,堆内存(Heap)和非堆内存(No-Heap),非堆内存又称为永久代(Permanent),永久的意思其实是针对于垃圾回收器来说的,表示这部分内容不需要回收. ...
随机推荐
- opencv3计算机视觉+Python(一)
基本I/O脚本 读/写图像文件 OpenCV的imread函数和imwrite函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF ...
- bootstrap-select 使用笔记 设置选中值及手动刷新
直接笔记: 1.页面刚加载完填充select选项数据时,需要手动刷新一下组件,否则没有选项值.(组件初始化时,li 与 option 分离的,需要刷新一下(据说)) $.post('/cpms/tod ...
- image has dependent child images
在删除镜像之前要先用 docker rm 删掉依赖于这个镜像的所有容器(哪怕是已经停止的容器),否则无法删除该镜像. 停止容器 # docker stop $(docker ps -a | grep ...
- PAT 天梯赛 L1-043. 阅览室 【STL】
题目链接 https://www.patest.cn/contests/gplt/L1-043 思路 将每一次 借出和归还 都用 MAP 标记 如果归还的时候 已经被标记过了 那么 ANS ++ 并且 ...
- SOA宣言和微服务特点
如果从概念层来看,我更喜欢把SOA归为企业架构的范畴,从企业架构出发把业务分解为不同业务域的服务,关注系统间的服务互联互通的规范,并不关心如何实现.也就是说在企业架构上使用SOA支撑业务,而在方案架构 ...
- I.MX6Q(TQIMX6Q/TQE9)学习笔记——U-Boot移植
其实Freescale的BSP移植文档已经将u-boot的移植步骤讲述的非常详细了,但为了以后方便查阅,还是按照自己的理解记录在这里. 获取源码 根据前一篇文章搭建好LTIB环境后就可以非常方便的导出 ...
- SOA 面向服务架构 阅读笔记(六)
20 SOA质量 服务质量是成功的关键因素 20.1 了解SOA带来的无法预料的挑战 不同部门开发 每个开发的组件整合在一起,形成复合应用程序 整合业务流程,考虑质量问题 衡量SOA的质量. 事物质量 ...
- start、run、join
首先得了解什么是主线程,当Java程序启动时,一个线程立刻运行,该线程通常叫做程序的主线程(main thread).主线程的重要性体现在两方面:1. 它是产生其他子线程的线程:2. 通常它必须最后完 ...
- async/await方法解析
欲了解await,必须先了解Promise,可参考: http://www.cnblogs.com/yanze/p/6347646.html 支持度: ES6已支持Promise,ES7也决定支持aw ...
- INSPIRED启示录 读书笔记 - 第19章 用户体验设计与实现
先定义用户体验再动手开发 在软件开发过程中,有很多工作可以同时进行.比如,需求调研和产品设计(用户体验设计).开发与测试 尽管如此,用户体验设计和软件开发就不能同时进行,原因有五点 1.与软件开发团队 ...