jvm 年轻代、年老代、永久代
关键字约定
- Young generation –>新生代
- Tenured / Old Generation –>老年代
- Perm Area –>永久代
年轻代:
所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个 Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个 Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor去也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。
年老代:
在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。
永久代:
用于存放静态文件,如今Java类、方法等。永久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的永久代空间来存放这些运行过程中新增的类。永久代大小通过-XX:MaxPermSize=<N>进行设置。
包括 | 垃圾回收算法 | |
年轻代 | Eden区、s0、s1区 | 复制算法 |
老年代 | 标记压缩 |
对象如何进入老年代:
1、一般来说,对象达到一定年龄后就会进入老年代,对象的年龄是由gc的次数决定的,在新生代中,每gc一次,对象如果没有被回收的化年龄就会+1。
2、大对象(新生代Eden区无法装入时,会直接进入老年代)。
垃圾回收算法:
1、复制算法:其核心思想就是将内存个空间分为两块,每次只使用其中一块,在垃圾回收时,在垃圾回收时,将正在使用的内存中的存留对象复制到未被使用的内存块中去,之后去清除之前正在使用的内存块中所有的对象,反复去交换两个内存的角色,完成垃圾收集。java中新生代from和to空间就是使用这个算法。
2、标记压缩算法:标记压缩法在标记清除法基础上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。Java老年代使用的就是标记压缩算法。
垃圾收集器
串行回收器
使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。
串行回收器可以在新生代和老年代使用,根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。
通过JVM参数-XX:+UseSerialGC
可以设置新生代串行垃圾回收器和老年代串行垃圾回收器。
并行回收器(parNew回收器)
并行回收器在串行回收器的基础上做了改进,他可以使用多线程同时进行垃圾回收,对于计算能力强的计算机而言,可以有效的缩短垃圾回收所需的实际时间。
parNew回收器是一个工作在新生代的垃圾回收器,他只是简单的将串行回收器多线程化,他的回收策略和算法和串行回收器一样。
通过JVM参数-XX:+UseParNewGC新生代ParNew回收器,老年代则使用串行回收器。
ParNew回收器工作时的线程数量可以使用-XX:ParallelGCThreads参数指定,一般最好和计算机的CPU相当,避免过多的线程影响性能。
jvm 年轻代、年老代、永久代相关推荐
- 【JVM】元空间与永久代区别
永久代(PermGen) 在自定义类加载器还不是很常见的时候,类大多是static的,很少被卸载或收集,因此被成为"永久的(Permanent)".同时,由于类class是JVM实 ...
- JDK1.8 JVM元数据区取代了永久代,元数据空间并不在虚拟机中,而是使用本地内存
JDK1.8 JVM运行时内存数据区域划分.1.8同1.7比,最大的差别就是:元数据区取代了永久代.元空间的本质和永久代类似,都是对JVM规范中方法区的实现.不过元空间与永久代之间最大的区别在于:元数 ...
- JVM之 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别
文章目录 0.前言(JVM 运行时区域) 1.PermGen(永久代) 2.Metaspace(元空间) 3.JDK6 .JDK7.JDK8 内存溢出的示例 4.元空间与本地内存 5.总结 0.前言( ...
- JVM之方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别
JVM体系结构 根据 JVM 规范,JVM 运行时区域大致分为 方法区.堆.虚拟机栈.本地方法栈.程序计数器 五个部分. 1).方法区 方法区是JVM 所有线程共享. 主要用于存储类的信息.常量池.方 ...
- JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别
原文网址:JVM原理系列--元空间(MetaSpace)与永久代(PermGen)的区别_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍JVM中元空间(MetaSpace)与永久代(PermG ...
- 什么是Java的永久代(PermGen)内存泄漏
转自:http://www.codelast.com/?p=7248 WHAT IS A PERMGEN LEAK? 什么是Java的永久代(PermGen)内存泄漏? What follows is ...
- 永久代退出舞台,元空间腾空出世
文章目录 一.前言 二.元空间由来和本质 2.1 元空间的诞生与永久代的消失 2.2 从永久代到元空间 2.2.1 JDK8之前,永生代在哪里? 2.2.2 JDK8之后,永生代废弃,元空间诞生 2. ...
- JVM分化回收机制(年轻代、年老代、永久代)
分代回收机制:JVM将堆内存划分为Eden.Survivor和Tenured/Old空间. (Minor GC )年轻代 :Eden.Survivor.尽可能快的收集生命周期短的对象. 在年轻代中经历 ...
- JVM年轻代,老年代,永久代详解
前言 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.本篇文章主要讲解内存区域的年轻代,老年代和永久代,略微提及一些垃圾回收算法,下面是正文. 堆整体 堆主 ...
最新文章
- PagedGeometry 笔记03
- (面试)java基础-== 和 equals 的区别?
- 阿里发布图计算平台GraphScope,即将向全社会开源
- 即将开源 | 2亿用户背后的Flutter应用框架Fish Redux
- Android Studio引入.so文件的正确姿势 以及调用.so 文件时报错has text relocations 解决
- php 内存队列,memcache构建简单的内存消息队列_PHP教程
- 论文绘图神器来了:哈佛博士后开源一行代码绘制不同期刊格式图表
- java评论回复功能例子_Java实现评论回复功能的完整步骤
- 2017.4.16 麦森数 思考记录
- 10-11-基数排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版
- uni-app获取车牌号
- 温度检测单片机c语言程序设计,基于STC89C52单片机的温度检测系统设计
- 平稳时间序列分析:ARMA模型
- VMware12虚拟机怎么下载安装?保姆级安装教程,让你一分钟学会
- 定性分析PK定量分析:情敌还是战友?
- 超详细陀螺仪MPU6050模块输出姿态角(有完整版源码)
- python实现图片识别文字程序
- doris 动态分区
- Debian 启用root账户远程登录并删除多余用户
- 基于Filament引擎的Animoji效果实现