【转】Java虚拟机的JVM垃圾回收机制
1.JVM内存空间

JVM堆(Heap)= 新生代(Young) + 旧生代(Tenured)
分区作用:
新创建的对象通常先将其分配在新生代中,在新生代中经过若干次GC之后仍未释放的对象,再将它移动到旧生代。为了让内存回收更高效(GC会暂停JVM中的应用),Sun JDK在1.2开始对堆采用了分代管理的方式。在分配对象遇到内存不足时,先对新生代进行GC(Young GC);当新生代GC之后仍无法满足内存空间分配需求时, 才会对整个堆空间以及方法区进行GC (Full GC)
相关参数:
-Xms -- 设置堆内存初始大小
-Xmx -- 设置堆内存最大值
-XX:MaxTenuringThreshold -- 设置对象在新生代中存活的次数
-XX:PretenureSizeThreshold -- 设置超过指定大小的大对象直接分配在旧生代中
注意点:当新生代设置得太小时,也可能引发大对象直接分配到旧生代中。
新生代(Young)= Eden区 + Survivor区
分区作用:
Eden区为对象通常最初分配到的地方,Survivor区分为S0和S1两块大小相等的区域。JVM进行Minor GC时,将Eden中还存活的对象拷贝到Survivor区中,还会将Survivor区中还存活的对象拷贝到Tenured区中。在这种GC模式下,JVM为了提升GC效率, 将Survivor区分为S0和S1,这样就可以将对象回收和对象晋升分离开来。
相关参数:
-Xmn -- 设置新生代内存大小。
-XX:SurvivorRatio -- 设置Eden与Survivor空间的大小比例
注意点: 图中Virtual部分表示可伸缩的内存空间,当用-Xms在指定堆的初始大小为128m,通过-Xmx指定堆最大为256m时,JVM会根据内存情况在128m与256m之间伸缩。为了避免JVM进行这些伸缩消耗性能,对于能够提供稳定内存空间的用作服务器的JVM,通常将-Xms和-Xmx设置为相等。
方法区(Perm)
分区作用:
也被成为持久代,用来存放JVM加载的类型信息。包括: 类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表等。方法区是全局共享的,在一定条件下也会被GC。
相关参数:
-XX:PermSize --设置Perm区的初始大小
-XX:MaxPermSize --设置Perm区的最大值
JVM方法栈(注意:不是分区)
作用:
JVM方法栈为JVM线程私有内存,当方法运行完毕后,其对应的栈帧内存会自动释放
相关参数:
-Xss --设置方法栈的最大值
TLAB:
JVM所占用的主要内存都是从堆空间分配的,堆是所有线程共享的,因此在堆上分配内存需要加锁,Sun JDK为提升效率,会为每个新建的线程在Eden上分配一块独立的空间由该线程独享,这块空间称为TLAB(Thread Local Allocation Buffer)。其大小由JVM根据运行情况计算得到,也可通过参数-XX:TLABWasteTargetPercent来设置TLAB可占用的Eden空间的百分比,默认值为1%。在TLAB上分配内存不需要加锁,因此JVM在给线程中的对象分配内存时会尽量在TLAB上分配。如果对象过大或TLAB用完,则仍然在堆上进行分配。
2.Sun JDK GC收集器
跟踪收集器简介
复制(Copying)

标记-清除(Mark-Sweep)

ü 优缺点:在空间中存活对象较多的情况下较为高效,但由于该算法为直接回收不存活对象所占用的内存,因此会造成内存碎片。
标记-压缩(Mark-Compact)
ü 算法:标记阶段与“标记-清除”算法相同,但在清除阶段有所不同。在回收不存活对象所占用的内存空间后,会将其他所有存活对象都往左端空闲的空间进行移动,并更新引用其对象指针。
ü 过程:

ü 优缺点:在“标记-清除”的基础上还需要进行对象移动,成本相对较高,好处则是不产生内存碎片。
3. Sun JDK GC策略

图4 Sun JDK中可用的GC方式
基于上一小节讲解的跟踪收集器算法,Sun JDK在新生代和老生代进行了不同的算法实现,形成了上图中的GC方式分布。本小节将具体介绍新生代和老生带的GC策略及组合方式。
新生代 – 串行GC(Serial Copying)
算法:复制(Copy)
过程:
1. 扫描出新生代中存活的对象;
2. Minor GC将存活的对象复制到做为To Space的S0/S1区;
3. 之前做为To Space/From Spache的S0/S1区对换角色;
4. 经历过几次Minor GC仍然存活的对象,放入老生代。
新生代 – 并行回收GC(Parallel Scavenge)
算法:复制(Copy)
过程:在扫描和复制时均采用多线程方式进行(如下图),并且并行回收GC为大的新生代回收做了很多优化(可以自行扩展阅读相关资料)。

新生代 – 并行GC(ParNew)
老生代 – 串行GC(Serial MSC)
老生代 – 并行GC(Parallel Mark Sweep、Parallel Compacting)
老生代 – 并发GC(CMS:Concurrent Mark-Sweep GC)

优缺点:如上图,优点是只有在第一次标记和重新标记阶段需要暂停整个应用,所以能够做到影响应用响应时间很短。缺点是并发标记和并发收集阶段CMS会与应用线程争用CPU资源(用增量CMS模式可以缓解),并且容易产生内存碎片,free-list机制会导致Minor GC效率下降。
配置方法:通过-XX:UseConcMarkSweepGC来启动老生代CMS GC;通过-XX:+UseCMSCompactAtFullCollection来启动内存碎片整理功能(整理也会暂停应用)。
4.Sun JDK GC默认策略及组合策略
ü Clinet、Server模式默认GC策略
|
|
新生代GC方式 |
旧生代和持久代GC方式 |
|
Client |
串行GC |
串行GC |
|
Server |
并行回收GC |
Parallel Mark Sweep GC |
ü Sun JDK GC组合方式
|
|
新生代GC |
旧生代和持久代GC |
|
-XX:+UseSerialGC |
串行GC |
串行GC |
|
-XX:+UseParallelGC |
并行回收GC |
Parallel Mark Sweep GC |
|
-XX:+UseConcMarkSweepGC |
并行GC |
并发GC 当出现Concurrent Mode Failure时采用串行GC |
|
-XX:+UseParNewGC |
并行GC |
串行GC |
|
-XX:+UseParallelOldGC |
并行回收GC |
Parallel Mark Conpact |
|
-XX:+UseConcMarkSweepGC -XX:-UseParNewGC |
串行GC |
并发GC 当出现Concurrent Mode Failure或Promotion Failed时采用串行GC |
|
不支持的组合方式 |
1.-XX:+UseParNewGC -XX:+UseParallelOldGC 2.-XX:+UseParNewGC -XX:+UseSerialGC |
【转】Java虚拟机的JVM垃圾回收机制的更多相关文章
- 深入理解Java虚拟机之JVM垃圾回收随笔
1.对象已经死亡? 1.1引用计数法:给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器都为0的对象就是不可能再被使用 的.但是它很难解决 ...
- 深入理解java虚拟机之——JVM垃圾回收策略总结
如何判断一个对象是否存活 引用计数算法:给对象中添加一个引用计数器,每当有引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器为0的对象就是不可能再被使用. Java虚拟机里面没有 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- 浅析 Java 与 C++ 的垃圾回收机制
Java老师在期末复习大纲上出了一道关于JVM垃圾回收机制的题目,想要我们简述一下JVM垃圾回收机制,与老师交流后,大概老师是希望通过与其他语言在垃圾回收对比,介绍一下Java在这方面的特点和 ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
随机推荐
- bzoj3728: PA2014Final Zarowki
Description 有n个房间和n盏灯,你需要在每个房间里放入一盏灯.每盏灯都有一定功率,每间房间都需要不少于一定功率的灯泡才可以完全照亮. 你可以去附近的商店换新灯泡,商店里所有正整数功率的 ...
- 蓝桥杯比赛javaB组练习《饮料换购》
题目如下: 饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么 ...
- 消息队列NetMQ 原理分析5-StreamEngine、Encord和Decord
消息队列NetMQ 原理分析5-StreamEngine,Encord和Decord 前言 介绍 目的 StreamEngine 发送数据 接收数据 流程分析 Encoder V2Encoder V1 ...
- spring容器注入一个接口的两个实现类
spring容器中能拥有两个同种类型的bean吗?我有两个dao类同时实现一个接口,这两个接口注入时报了异常如下. org.springframework.beans.factory.NoSuchBe ...
- javascript事件循环机制 浅尝手记
引入 众所周知Javascript是一个单线程的机制,虽然可以依托多线程的浏览器实现页面如何实现页面复杂的渲染.事件响应,但仍不会改变其单线程的本质:所以对于js的事件循环机制的了解是一个前端人员的必 ...
- windows 注入 之 SetWindowHookEx
前面的项目用到hook 还是在半年前,没想到最近有用到了,说实话,在项目组就提出,能用别的办法还是不要用这种,毕竟不太正道(感觉哈). 最近又牵扯到第三方对接的任务,没办法我又回到了HOOK上了.与窗 ...
- 使用bootstrap网格系统自适应盒子宽度时保持所有盒子高度一致。
使用了bootstrap网格系统的好处是很容易便实现了响应式布局,盒子可以根据设置的样式,随着屏幕的大小改变而自动改变宽度,但是也存在一个问题,那就是盒子的高度是由盒子的内容决定的,如果盒子里的内容不 ...
- 001-Mono for android在vs2012中发布设置
详细讲解 :http://www.cr173.com/html/20099_1.html 这里是快速设置: 1,把Debug换成Release 这里是必须改的 2,点击工具选项 3, ...
- python------函数嵌套及作用域链
1.三元运算if条件成立的结果 if 条件 else 条件不成立的结果例如: a=20 b=10 c=a if a>b else b print(c) 2.命名空间 全局命名空间:创建的存储&q ...
- 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装
[MySQL]Linux下MySQL 5.5.5.6和5.7的RPM.二进制和源码安装 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后, ...