文档章节

jvm 年轻代、年老代、永久代

xixingzhe
 xixingzhe
发布于 2017/09/06 15:49
字数 1175
阅读 79
收藏 0
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相当,避免过多的线程影响性能。

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
xixingzhe
粉丝 2
博文 175
码字总数 46744
作品 0
西城
程序员
私信 提问
JAVA虚拟机垃圾回收机制和JAVA排错三剑客

一、Java虚拟机逻辑回收机制 1、Java垃圾回收器 Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自...

hawapple
2018/06/28
0
0
JAVA内存管理和JVM运行机制、垃圾回收、内存调优

一、JAVA内存管理 java是跨平台语言,java预编译.class文件放置JVM虚拟机中运行; Java的内存结构,也就是运行时的数据区域 运行时数据区 方法区:常量池、变量等存储地方;(持久区) 堆:实...

盼望明天
2018/08/03
0
0
深入浅出JVM内存模型与JVM参数详细配置

JVM内存结构 由上图可以清楚的看到 JVM的内存空间分为3大部分: 堆内存 方法区 栈内存 其中 栈内存 可以再细分为 java虚拟机栈和本地方法栈,堆内存可以划分为新生代和老年代, 新生代中还可以...

小刀爱编程
2018/11/01
0
0
Oracle HotSpot虚拟机的JVM栈和方法区实现

Java Heap和Method Area是JVM中内存占用最大的区域,也是监控和调优的重点。 下图使用jvisualvm工具截取,Perm是永久代(Permanent Generation)、Old是年老代(Old Generation)、Eden Spac...

foodon
2014/12/10
0
0
JAVA虚拟机 JVM 详细分析 原理和优化(个人经验+网络搜集整理学习)

JVM是java实现跨平台的主要依赖就不具体解释它是什么了 ,简单说就是把java的代码转化为操作系统能识别的命令去执行,下面直接讲一下它的组成 1.ClassLoader(类加载器) 加载Class 文件到内...

小海bug
2018/06/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WEB 开发总结

事务处理 事务的4个基本特征 1.Atomic(原子性),事务中包含的操作被看做是一个整体的业务单元,这个业务单元中的操作要么全部成功,要么全部失败,不会出现部分成功,部分失败的场景。 2....

北漂的我
11分钟前
1
0
thinkphp5 利用七牛云 将amr格式语音文件转为mp3

$card_id 是我的本地的文件 将问价名字的后缀名去掉注意access_token的有效期public function ceshi1($card_id){ $mediaid = substr($card_id, 0, -4); $accessKey = ...

小小小壮
15分钟前
1
0
数据区域之堆栈

java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域, 这些区域都有各自的用途,创建和销毁时间 图: 程序计数器是一个较小的内存空间,它的作用可以看做是当前...

恋码之子
15分钟前
1
0
新的一年,来看看大数据与AI的未来展望

本文由云+社区发表 作者:堵俊平 在数据爆炸与智能革命的新时代,新的平台与应用层出不穷,开源项目推动了前沿技术和业界生态快速发展。本次分享将以技术和生态两大视角来看大数据和人工智能...

腾讯云加社区
16分钟前
1
0
死磕源码系列(ReentrantLock)

前言 在高并发领域,ReentrantLock有着广泛的用处,防止多线程带来的并发问题 对于源码,很多人和我一开始一样都觉得非常神秘 这次我将对ReentrantLock进行全方面的揭秘 核心 AbstractQueued...

石日天
16分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部