欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

JVM实战-03·JVM堆内存详解

程序员文章站 2022-05-09 11:09:06
目录JVM内存分配1. 年轻代2. 老年代3. 永久代堆内存分配过程JVM堆内存常用参数JVM内存分配1. 年轻代(或称新生代,Young、New)通常用来放新生成的对象(但不绝对,如可以通过-XX:PretenureSizeThreadshold配置将大对象直接分配在老年代)。年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象。年轻代分3个区,1个Eden区,2个Survivor区(from 和 to),默认比例是8:1:1。每次只使用Eden和一个.....

目录

 

JVM内存分配

1. 年轻代

2. 老年代

3. 永久代

堆内存分配过程

JVM堆内存常用参数

 


JVM内存分配

JVM实战-03·JVM堆内存详解

1. 年轻代

(或称新生代,Young、New)通常用来放新生成的对象(但不绝对,如可以通过-XX:PretenureSizeThreadshold配置将大对象直接分配在老年代)。年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象。年轻代分3个区,1个Eden区,2个Survivor区(from 和 to),默认比例是8:1:1。每次只使用Eden和一个Survivor区,另一个Survivor区空着。空Survivor区用来放MinorGC时从Eden和在使用的Survivor区中复制来的活着的对象。针对年轻代的GC为Minor GC或称Young GC,在Eden剩余空间不足以分配新对象时触发。

2. 老年代

老年代(Old、Tenure)通常用来存放从年轻代复制过来的对象(也可直接在老年代分配对象)。老年代中存放的是一些生命周期较长的对象。针对老年代的GC为Major GC或称Full GC,在老年代剩余空间不足以容纳新对象时触发。Major GC经常会伴随至少一次的Minor GC(但非绝对,如HandlePromotionFailure策略,有可能直接进行Major GC;Parallel Scavenge收集器提供了直接进行Major GC的策略选择),Major GC一般比Minor GC慢10倍以上。

3. 永久代

通常还可以听到永久代(PermGen space)的概念,其实它并不在Java堆。有时永久代又被称为元空间(Metaspace)或方法区,比较乱。它们的区别是:方法区为JVM的规范,永久代、元空间分别是方法区在HotSpot中的一种实现,对于其他类型的虚拟机实现,如 JRockit(BEA)、J9(IBM),其并没有这些概念。

堆内存分配过程

  1. 首先看Eden剩余空间是否足够分配该对象,若够则直接在Eden分配;
  2. 否则进行MinorGC:将Eden和在使用的Survivor区中活着的对象复制到另一个Survivor区,并回收Eden和使用着的Survivor区。然后把对象分配到Eden,以后另一个Survivor成为使用的Survivor区;
  3. 若另一个Survivor区不能完全容纳复制过来的对象,则能放下的放入该Survivor,把放不下的放到老年代(即进行分配担保);
  4. 若老年代剩余空间不够了则进行Full GC,
  5. 若Full GC后仍不够则抛出OOM异常。

JVM堆内存常用参数

参数 描述
-Xms 堆内存初始大小,单位m、g
-Xmx(MaxHeapSize) 堆内存最大允许大小,一般不要大于物理内存的80%
-XX:PermSize 非堆内存初始大小,一般应用设置初始化200m,最大1024m就够了
-XX:MaxPermSize 非堆内存最大允许大小
-XX:NewSize(-Xns) 年轻代内存初始大小
-XX:MaxNewSize(-Xmn) 年轻代内存最大允许大小,也可以缩写
-XX:SurvivorRatio=8 年轻代中Eden区与Survivor区的容量比例值,默认为8,即8:1
-Xss 堆栈内存大小

本文地址:https://blog.csdn.net/csdn_0911/article/details/109625242