JVM内存分配与回收

JVM 分代

JVM把堆分为年轻代和老年代,年轻代又分为1个Eden区和2个Survivor区,Eden和Survivor的内存的大小比例是8:1:1。
为什么要分代?
很大的原因就是分代之后便于垃圾回收,提高回收效率。如果不分代,所有的对象全部都分配在一块大的内存上,那么每经过一次GC,就需要扫面一遍内存,可想而知时间的开销是巨大的。
为什么要把堆分为1个Eden和2个Survivor区?
通过将堆划分一个Eden区和两个Survivor区解决了内存碎片化问题。
设置一个Survivor会产生内存碎片,如图:

使用两个Survivor则不会,永远有一个Survivor是空的另一个而是无碎片化的

内存分配策略

步骤:
1、如果启用了线程本地分配缓冲TLAB,则优先在TLAB上分配。
2、如果对象不是很大没有达到配置参数设置的值,直接在Eden区分配,经过一次Minor GC,Eden区存活对象就会被移动到第一块Survivor中,紧接着Eden区被清空;等Eden区又满了之后,再次触发一次Minor GC,将Eden区和第一块Survivor区存活的对象复制到第二块Survivor中,接着清空第一块Survivor和Eden区,然后再一次Minor GC会将第二块Survivor区和Eden区存活的对象复制到第一块Survivor中,就这样周而复始的进行,直到其中的一个Survivor无法存放Minor GC后存活的对象,或者经过循环次数达到16次之后,就会通过空间分配担保机制使对象提前进入老年代。
3、如果占用内存空间较大的对象,则直接在老年代分配内存空间。例如很长的数组或字符串。目的是尽量避免在Eden区和Survivor之间产生大量的内存复制。

空间分配担保机制
为了提高内存的利用率,用其中一个Survivor作为轮换备份,因此当出现大量对象在Minor GC 仍然存活的情况下,就需要通过空间分配担保机制,让Survivor无法容纳的对象直接进入老年代。前提是老年代能容纳下年轻代存活的对象,但是老年代也不知道是否有足够的内存来存放这些对象。所以VM会首先检查老年代连续空间是否大于新生代对象大小或者历次晋升的平均大小,如果条件成立,则将存活的对象复制到老年代中。否则需要进行Full GC,来让老年代腾出更多的空间。

对象晋升
对象从Survivor区复制到老年的过程为“对象晋升”。对象晋升的条件:
(1)年龄阈值:
VM为每个对象定义一个对象计数器,每经过一次Minor GC,存活对象的年龄计数器就会加1,当增加到年龄阈值MaxTenuringshold(默认是15),才能晋升到老年代。
(2)动态年龄绑定:提前晋升
如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或者等于该年龄的对象就可以直接进入老年代。

JVM垃圾回收机制一的更多相关文章

  1. JVM垃圾回收机制总结:调优方法

    转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍

  2. JVM内存管理和JVM垃圾回收机制

    JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...

  3. JVM垃圾回收机制概述

    JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...

  4. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  5. JVM基础系列第8讲:JVM 垃圾回收机制

    在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...

  6. JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  7. JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)

    一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...

  8. JVM垃圾回收机制和常用算法

    由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...

  9. 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了

    前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...

  10. java JVM垃圾回收机制

    Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...

随机推荐

  1. codeforces 664A A. Complicated GCD(水题)

    题目链接: A. Complicated GCD time limit per test 1 second memory limit per test 256 megabytes input stan ...

  2. ROM的分类

    转载自:http://www.ic37.com/htm_tech/2012-5/82774_23811.htm ROM(只读存储器)按其内容写入方式,一般分为3种:固定内容ROM:可一次编程PROM: ...

  3. fhq-treap简介

    \(fhq-treap\)是个好东西啊!无旋转\(treap\)果然是好写,而且还是比较好理解的. 这种数据结构是由神犇fhq发明的.\(Think\ functional!\) fhq神犇说,函数式 ...

  4. bzoj 4571 [Scoi2016]美味——主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4571 按位考虑,需要的就是一个区间:比如最高位就是(2^k -x). 对于不是最高位的位置该 ...

  5. heartbeat3.x部署安装

    使用Heartbeat构建Linux双机热备系统 本文档版本号: V1.0 版 本 历 史 版本号 更新时间 说 明 创建者 V1.0 2013-3-23 修改版 金桥 1 部署环境 OS: Red ...

  6. 23.java方法的深入

    深入: public class MethodTest05{ public static void main(String[] args){ int i=m1(ture); System.out.pr ...

  7. myeclipse配置

    windows->preference->MyEclipse->servers->tomcat 选项下 Tomcat 6.x 点 enable 设置tomcat directo ...

  8. bzoj1195

    AC自动机+状压dp 多串匹配要想ac自动机 dp[i][S]表示在i状态选中S 转移就用bfs,每个点通过fail收集信息,不要忘记通过fail传递 昨天搞不明白为什么自动机每次只可以转移儿子,不可 ...

  9. HashMap为什么比数组查询快

    通常数组不直接保存值,而是通过保存值的list.然后对list中的“值”使用equals方法比较,这部分查询速度自然慢.但是如果有好的散列函数,数组的每个位置就只有较少的“值”.因此,不是查询所有的l ...

  10. UltraISO中文版+注册码

    UltraISO v9.5.3.2901 百度网盘下载地址: http://pan.baidu.com/s/1l9t2U 新浪微盘下载地址: http://vdisk.weibo.com/s/rcvB ...