JVM年轻代,老年代,永久代详解
前言
最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家。本篇文章主要讲解内存区域的年轻代,老年代和永久代,略微提及一些垃圾回收算法,下面是正文。
堆整体
堆主要用于存放各种类的实例对象和数组。在java中被分为两个区域:年轻代和老年代。在java中还有一个永久代的意思,这里最后会单独说明。
年轻代和老年代的划分是为了更好的内存分派及回收。提高效率。
堆是垃圾回收机制的重点区域。我们知道垃圾回收机制有三种,minor gc,major gc 和full gc。针对于堆的就是前两种。年轻代的叫 minor gc,老年代的叫major gc。
年轻代
年轻代用来存放新近创建的对象,尺寸随堆大小的增加和减少而相应的变化,默认值是保持为堆的1/15。
年轻代的大小可以通过-xmn设置固定大小,也可以通过-xx:newratio设置年轻代和年老代的比例。
年轻代中存在的对象是死亡非常快的。存在朝生夕死的情况。
所以为了提高年轻代的垃圾回收效率,又将年轻代划分为三个区域,一个eden和两个sunrvivor from。
eden和survivor默认比例是8:1:1,进行垃圾回收采用的是分代复制算法。每次新生代的使用,会是eden区和一块survivor区。当我们进行垃圾回收的时候,清除正在使用的区域,将其中的存货对象,放入到另一个survivor区域,并进行整理,保证空间的连续。如果对象长时间存活,则将对象移动到老年区。存活下来的对象,他的年龄会增长1。当对象的年龄一次次存活,一次次增长,到达15的时候,这些对象就会移步到老年代。在年轻代执行gc的时候,如果老年代的连续空间小于新生代对象的总大小,就会触发一次full gc。是为了给新生代做担保,保证新生代的老年对象可以顺利的进入到老年代的内存区。
老年代
老年代中存放的对象是存活了很久的,年龄大于15的对象。在老年代触发的gc叫major gc也叫full gc。full gc会包含年轻代的gc。但老年代只要执行gc就一定是full gc。
full gc采用的是标记-清除算法。会产生内存碎片。在执行full gc的情况下,会阻塞程序的正常运行。老年代的gc比年轻代的gc效率上慢10倍以上。对效率有很大的影响。
永久代
永久代是hotspot虚拟机,也就是我们使用的java虚拟机的特有的概念,他不属于堆内存,是方法区的一种实现,各大厂商对方法区有各自的实现。永久代存放jvm运行时,需要的类,包含java库的类和方法,在触发full gc的情况下,永久代也会被进行垃圾回收。永久代的内存溢出也就是 pergen space。
元空间
元空间是metaspace,在jdk1.8的时候,jvm移除了永久代的概念,元空间也是对java虚拟机的方法区的一种实现。元空间与永久代最大的区别在于,元空间不在虚拟机中,使用本地内存。通过配置如下参数可以更改元空间的大小。
-XX:MetaspaceSize:初始空间的大小。达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
永久代的回收会随着full gc进行移动,消耗性能。每种类型的垃圾回收都需要特殊处理元数据。将元数据剥离出来,简化了垃圾收集,提高了效率。
JVM年轻代,老年代,永久代详解相关推荐
- jvm中的年轻代 老年代 持久代 gc ----------转载
jvm中的年轻代 老年代 持久代 gc 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation) ...
- java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
- jvm中的年轻代 老年代 持久代 gc
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
- GC 年轻代 老年代 持久代
转载自:http://www.cnblogs.com/yaoyuan23/p/5587548.html 虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Gener ...
- java年轻代频繁gc_JVM 年轻代 老年代 持久代 gc
虚拟机中的共划分为三个代:年轻代(Young Generation).老年代(Old Generation)和持久代(Permanent Generation).其中持久代主要存放的是Java类的类信 ...
- 【JVM】元空间与永久代区别
永久代(PermGen) 在自定义类加载器还不是很常见的时候,类大多是static的,很少被卸载或收集,因此被成为"永久的(Permanent)".同时,由于类class是JVM实 ...
- JVM垃圾回收系列--垃圾回收器的详解/对比
原文网址:JVM垃圾回收系列--Java垃圾回收器的详解/对比_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的垃圾回收器,包括:JDK默认的垃圾回收器.CMS与G1的区别.年轻代回收器.老 ...
- 一篇文章带你快速理解JVM运行时数据区 、程序计数器详解 (手画详图)值得收藏!!!
受多种情况的影响,又开始看JVM 方面的知识. 1.Java 实在过于内卷,没法不往深了学. 2.面试题问的多,被迫学习. 3.纯粹的好奇. 很喜欢一句话:"八小时内谋生活,八小时外谋发展. ...
- JVM笔记-13运行时数据区-堆(OOM、年轻代老年代)
学习JVM的一点简单笔记,宋红康老师jvm讲的很好,感谢. 尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) OOM 异常是什么? 堆空间溢出,存放数据大于堆空间大小. packa ...
- JVM的年轻代、年老代(老年代)和永生代(持久代)【Loadrunner性能调优】
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
最新文章
- 外键为','(逗号)拼接ID,连接查询外键表ID
- 蓝桥杯第八届省赛JAVA真题----k倍区间
- mysql 左连接 和全连接_mysql左连接,右连接,内连,全连
- 多线程3,线程池封装库
- 运筹学笔记 网络计划
- kodi 默认桌面_如何自定义Kodi新的默认外观河口
- ubuntu 截图工具flameshot(火焰截图)
- “progtam received signal SIGABRT,Aborted.“错误
- python requests详解
- Android常用第三方支付
- 小学生四则运算考试系统Java
- 区块链开发(五)搭建以太坊区块链浏览器
- Qt技巧:获取QTextEdit文本内容
- 自行车(山地车)拆脚踏
- 无人机倾斜摄影测量测绘应用
- 透视perspective(CSS3)
- OpenCV绘图函数:cv2.line、cv2.circle、cv2.rectangle、cv2.ellipse、 cv2.putText()、cv2.setMouseCallback
- steam上显示服务器脱机怎么办,steam服务器脱机
- 前端学习笔记005:数据传输 + AJAX + axios
- Qt/C++编写物联网管理平台6-地图监控
热门文章
- 皮一皮:这样的领导还有吗
- 盘点几个开源的高仿项目,B站最像~
- 每日一皮:我靠,这个分枝真的merge回主干了!
- 博客搭建攻略(二):工具推荐
- 博客搭建攻略(一):平台选择
- android如何实现支付宝,(Android集成支付宝支付)react-native实现支付宝支付
- 用c#算成绩的总和_C# 基础知识系列- 6 Lambda表达式和Linq简单介绍
- 提高语音识别成功率的解决方案思路一
- 3D Object Detection——BEV-based methods
- tempfile PermissionError: [Errno 13] Permission denied