文档章节

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

xixingzhe
 xixingzhe
发布于 2017/09/06 15:49
字数 1175
阅读 56
收藏 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
粉丝 1
博文 170
码字总数 45595
作品 0
西城
程序员
JAVA虚拟机垃圾回收机制和JAVA排错三剑客

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

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

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

盼望明天
08/03
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
06/14
0
0
Jvm堆内存的划分结构和优化,垃圾回收详解(详细解答篇)

在JVM中堆空间划分如下图所示 上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条 1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代 2.新生代可以划分为三个区,Eden区,两个幸...

嘻哈开发者
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

@SpringBootApplication 注解

@SpringBootApplication注解是一个组合注解,包含以下注解 @Target(ElementType.TYPE) 注解的作用目标 @Retention(RetentionPolicy.RUNTIME) Reteniton的作用是定义被它所注解的注解保留多久,...

java.刘
39分钟前
0
0
sentinel自定义DataSource实战

序 本文主要研究一下如何自定义sentinel的DataSource,这里以jdbc为例。 maven <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-sen......

go4it
55分钟前
1
0
xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?

问题: 用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和Decisio...

tantexian
56分钟前
0
0
php-fpm的pool - 慢执行日志 - 进程管理 - open_basedir

php-fpm的pool : 为避免多站点使用同一个pool时因一个站点故障导致php资源耗尽,牵连使用同一个pool的其他站点的正常工作,可对每一个站点设置独立pool。 增加pool: 1.编辑php-fpm配置文件...

ZHENG-JY
今天
0
0
Linux之ssh服务默认端口修改

导读 SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全...

问题终结者
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部