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. 001-将Python源码转换为不需要环境的可执行文件

    1 安装pyinstaller pip install pyinstaller #或者 pip3 install pyinstaller 2 生成打包文件 在命令行中输入 pyinstaller -F ...

  2. SPOJ MAXOR (分块 || 可持久化字典树 || 异或)(好题)

    You are given a sequence A[1], A[2], ..., A[N]. (0 ≤ A[i] < 231, 1 ≤ N ≤ 12000). A query is defin ...

  3. MSTAR SETBOX 常用API

    HASHKEY: HashKey需要替换两个文件:“Customer_info.h”与“libecos.a” 1.MApi_DigiTuner_TPSGetLock() //判断是否有信号 2._Za ...

  4. OpenCV在Zedboard上的移植

    OpenCV编译 本文的前提是zynq交叉编译环境设置 下载opencv3.1.0源码,并解压 wget https://github.com/Itseez/opencv/archive/3.1.0. ...

  5. Dynamic Gcd

    树链剖分+差分 直接区间加显然是不行的,由于gcd(a,b,c)=gcd(a,a-b,b-c),那么我们对这些数差分,然后就变成单点修改.原本以为这道题很简单,没想到这么麻烦,就膜了发代码. 首先我们 ...

  6. PHP程序中的redis一些写法

    <?php /** * 以下均要先链接好redis */ sdk\libs\RedisHelper::connect("s1")->keys('*'); //这个是获取 ...

  7. 1.9 Hive常见属性配置

    一.Hive数据仓库位置配置 1. # Hive数据仓库位置配置: 默认位置(hive根目录): /user/hive/warehouse 注意事项: *在仓库目录下,没有对默认的数据库default ...

  8. 清理win10系统c盘

    本人C盘是128G SSD硬盘,Win10系统盘和一些常用的程序都装在这个盘(特大程序除外),目的是为了使用这些程序时提高响应速度.但是本人电脑使用1年,突然发现C盘以占用近70G的空间,实在是吓蒙撒 ...

  9. POJ3696【欧拉函数+欧拉定理】

    题意: 求最小T,满足L的倍数且都由8组成,求长度: 思路: 很强势的福利:点 图片拿出去食用更优 //#include<bits/stdc++.h> #include<cstdio ...

  10. linux tcpdump(转)

    转自 http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 默认启动 tcpdump 普通情况下,直接启动tcpdump将监 ...