JVM垃圾回收机制一
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垃圾回收机制一的更多相关文章
- JVM垃圾回收机制总结:调优方法
转载: JVM垃圾回收机制总结:调优方法 JVM 优化经验总结 JVM 垃圾回收器工作原理及使用实例介绍
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- JVM垃圾回收机制概述
JVM垃圾回收机制概述 1.定义 是指JVM用于释放那些不再使用的对象所占用的内存. 2.方式 2.1引用计数(早期) 当引用程序创建引用以及引用超出范围时,JVM必须适当增减引用数.当某个对象的引用 ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- JVM基础系列第8讲:JVM 垃圾回收机制
在第 6 讲中我们说到 Java 虚拟机的内存结构,提到了这部分的规范其实是由<Java 虚拟机规范>指定的,每个 Java 虚拟机可能都有不同的实现.其实涉及到 Java 虚拟机的内存, ...
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- JVM垃圾回收机制和常用算法
由于疫情的原因,所以目前一直在家远程办公,所以很多时间在刷面试题,发现2019大厂的面试虽然种类很多,但是总结了一下发现主要是这几点:算法和数据结构. JVM.集合.多线程.数据库这几点在面试的时候比 ...
- 真的可惜,四面阿里,结果我被JVM垃圾回收机制与 OOM异常卡住了
前言 为什么需要垃圾回收 首先我们来聊聊为什么会需要垃圾回收,假设我们不进行垃圾回收会造成什么后果,我们举一个简单的例子 我们住在一个房子里面,我们每天都在里面生活,然后垃圾都丢在房子里面,又不打扫, ...
- java JVM垃圾回收机制
Java语言出来之前,大家都在拼命的写C或者C++的程序,而此时存在一个很大的矛盾,C++等语言创建对象要不断的去开辟空间,不用的时候有需要不断的去释放控件,既要写构造函数,又要写析构函数,很多时候都 ...
随机推荐
- nginx: error while loading shared libraries: libGeoIP.so.1
wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz wget http://geolite.maxmind.com/do ...
- DNS多出口分析
DNS多出口分问题现象:当dns解析出的ip非域名的本地覆盖组,则怀疑是DNS多出口或者DNS劫持.接下来判断该ip是否为网宿ip,如果不是,则是劫持问题,走劫持流程进行反馈.如果是网宿ip,则用以下 ...
- [YNOI 2016] 掉进兔子洞
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4939 [算法] 不难发现 , ansi = (r1 - l1 + 1) + (r2 ...
- Linux查看CPU《型号..》《内存..》《硬盘..》《系统..》
1.查看物理cpu个数 grep 'physical id' /proc/cpuinfo | sort -u | wc -l 2.查看核心数量grep 'core id' /proc/cpuinfo ...
- Java中next() 与 nextLine() 区别
next(): 1.一定要读取到有效字符后才可以结束输入. 2.对输入有效字符之前遇到的空白,next() 方法会自动将其去掉. 3.只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符. 4. ...
- Asset Catalog Help (十一)---Removing Images and Sets
Removing Images and Sets Optimize the size of an asset catalog by removing unused images or sets. 通过 ...
- yzm10铺瓷砖 yzm10原创系列
yzm10铺瓷砖 一天yzm10接到任务,要求用2×1大小的瓷砖,来铺2×4的地面,地面需要恰好被铺满.这对yzm10来说太容易了,于是他马上设计出了5种不同的铺法(旋转情况算不同种,如图示2.4). ...
- Oracle 11g client 安装
本文所有红色字体标注的为本人计算机安装方法(Oracle 11g安装在本地 Oracle 11g client 也是安装在本地 如果情况一致 可参照本人方法安装) Oracle 11g client ...
- Exists 方法
public void ExistsMethodDemo() { string userId = "123"; string userName = "admin" ...
- 483. Smallest Good Base
For an integer n, we call k>=2 a good base of n, if all digits of n base k are 1. Now given a str ...