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. smali语法积累记录

    1.constructor 我们知道运行一个类的时候会先调用static方法中的内容,比如: static { System.loadLibrary("qihooTest"); } ...

  2. ORA-12547: TNS:lost contact

    碰到这个ORA-12547: TNS:lost contact的问题,翻了很多资料和METALINK,总结了一下原因: 1 是由于rpm包没有安装,对于我们的生产环境,此包是安装的. admin@p1 ...

  3. @PathVariable @RequestParam @RequestHeader @CookieValue POJO Servlet API

  4. AtCoder Grand Contest 007 E:Shik and Travel

    题目传送门:https://agc007.contest.atcoder.jp/tasks/agc007_e 题目翻译 现在有一个二叉树,除了叶子每个结点都有两个儿子.这个二叉树一共有\(m\)个叶子 ...

  5. Azure REST API (5) 中国Azure EA Portal Billing API

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. EA Portal的管理url是:https://ea.azure ...

  6. eclipse修改某一个项目的字符编码

    eclipse修改某一个项目的字符编码   1 选中要修改编码的文件,鼠标右键,选择[Properties]  2 左侧选中[Resource], 右侧出现[Text file encoding], ...

  7. window.location js截取url地址

    window.location方法的说明 原文链接: http://jiantian.org/index.php?page_id=2 window.location.href 整个URl字符串(在浏览 ...

  8. POJ - 1321 棋盘问题 dfs分层搜索(n皇后变式)

    棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47960   Accepted: 23210 Descriptio ...

  9. Java文件输入输出

    public static void FileIO(String filename){ FileInputStream fis = null; try { fis = new FileInputStr ...

  10. git commit 提交不了 error: pathspec 'project'' did not match any file(s) known to git.

    1. 问题--使用git将代码提交到码云,使用到以下命令时: git commit -m 'init project' # 报错 error: pathspec 'project'' did not ...