大对象直接进入老年代
大对象就是指需要大量连续空间的java对象,写程序时应该避免“短命的大对象”
可根据-XX:PretenureSizeThreshold来设置多大的对象直接进入老年代,但这东西只对Serial和ParNew收集器有效
长期存活的对象进入老年代
虚拟机为每个对象定义一个年龄计数器
在第一次Minor GC后仍然存活, 将对象移入Survivor空间年龄设为1。
今后每执行一次Minor GC,年龄加1。加到一定程度(-XX:MaxTenuringThreshold 默认15),晋升到老年代。
VM : -verbose:gc - Xms20M -Xmx20M -Xmn10M - XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails
byte[] allocation1, allocation2, allocation3;
allocation1 = new byte [_1MB / 4];
allocation2 = new byte [4 * _1MB];
allocation3 = new byte [4 * _1MB];
allocation3 = null;
allocation3 = new byte [4 * _1MB];
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 1 (max 1)
- age 1: 413416 bytes, 413416 total
: 4695K->403K(9216K), 0.0028899 secs] 4695K->4499K(19456K), 0.0029114 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 1 (max 1)
: 4499K->0K(9216K), 0.0006270 secs] 8595K->4499K(19456K), 0.0006456 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4423K [0x040e0000, 0x04ae0000, 0x04ae0000)
eden space 8192K, 54% used [0x040e0000, 0x04531fa8, 0x048e0000)
from space 1024K, 0% used [0x048e0000, 0x048e0000, 0x049e0000)
to space 1024K, 0% used [0x049e0000, 0x049e0000, 0x04ae0000)
tenured generation total 10240K, used 4499K [0x04ae0000, 0x054e0000, 0x054e0000)
the space 10240K, 43% used [0x04ae0000, 0x04f44ef8, 0x04f45000, 0x054e0000)
compacting perm gen total 12288K, used 2111K [0x054e0000, 0x060e0000, 0x094e0000)
the space 12288K, 17% used [0x054e0000, 0x056effe0, 0x056f0000, 0x060e0000)
No shared spaces configured.
VM : - verbose:gc - Xms20M -Xmx20M - Xmn10M - XX:SurvivorRatio=8 - XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution - XX:+PrintGCDetails
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 15 (max 15)
- age 1: 413416 bytes, 413416 total
: 4695K->403K(9216K), 0.0026816 secs] 4695K->4499K(19456K), 0.0027035 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 15 (max 15)
- age 2: 413416 bytes, 413416 total
: 4499K->403K(9216K), 0.0005062 secs] 8595K->4499K(19456K), 0.0005261 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4827K [0x04130000, 0x04b30000, 0x04b30000)
eden space 8192K, 54% used [0x04130000, 0x04581fa8, 0x04930000)
from space 1024K, 39% used [0x04930000, 0x04994ee8, 0x04a30000)
to space 1024K, 0% used [0x04a30000, 0x04a30000, 0x04b30000)
tenured generation total 10240K, used 4096K [0x04b30000, 0x05530000, 0x05530000)
the space 10240K, 40% used [0x04b30000, 0x04f30010, 0x04f30200, 0x05530000)
compacting perm gen total 12288K, used 2111K [0x05530000, 0x06130000, 0x09530000)
the space 12288K, 17% used [0x05530000, 0x0573ffe0, 0x05740000, 0x06130000)
No shared spaces configured.
动态年龄判断,就是说相同年龄所有对象的大小相加的总和大于Survivor的一半,那年龄大于或等于这个年龄的对象就直接进入老年代
VM : - verbose:gc - Xms20M -Xmx20M - Xmn10M - XX:SurvivorRatio=8 - XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution - XX:+PrintGCDetails
byte[] allocation1, allocation2, allocation3, allocation4;
allocation1 = new byte [_1MB /6+12*1024];
allocation2 = new byte [_1MB / 6+12*1024];
allocation3 = new byte [4 * _1MB];
allocation4 = new byte [4 * _1MB];
allocation4 = null;
allocation4 = new byte [4 * _1MB];
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 1 (max 15)
- age 1: 525384 bytes, 525384 total
: 4805K->513K(9216K), 0.0026955 secs] 4805K->4609K(19456K), 0.0027157 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[GC [DefNew
Desired survivor size 524288 bytes, new threshold 15 (max 15)
: 4609K->0K(9216K), 0.0005254 secs] 8705K->4609K(19456K), 0.0005400 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
Heap
def new generation total 9216K, used 4423K [0x04250000, 0x04c50000, 0x04c50000)
eden space 8192K, 54% used [0x04250000, 0x046a1fa8, 0x04a50000)
from space 1024K, 0% used [0x04a50000, 0x04a50000, 0x04b50000)
to space 1024K, 0% used [0x04b50000, 0x04b50000, 0x04c50000)
tenured generation total 10240K, used 4609K [0x04c50000, 0x05650000, 0x05650000)
the space 10240K, 45% used [0x04c50000, 0x050d0458, 0x050d0600, 0x05650000)
compacting perm gen total 12288K, used 2112K [0x05650000, 0x06250000, 0x09650000)
the space 12288K, 17% used [0x05650000, 0x05860010, 0x05860200, 0x06250000)
No shared spaces configured.
空间分配担保
在发生Minor GC虚拟机会统计进入老年代的平均大小是否大于剩余空间,如果大于,直接Full GC,如果小于,查看HandlePromotionFailure设置是否允许担保失败。
如果允许,进行Minor GC ,不允许,进行Full GC。
当HandlePromotionFailure失败,只好Full GC
建议HandlePromotionFailure打开,避免Full GC过于频繁
分享到:
相关推荐
静态存储分配是指在编译时就能确定每个数据目标在...这种分配策略要求程序代码中不允许有 可变数据结构(比如可变数组) 的存在,也不允许有嵌套或者递归的结构出现,因为它们都 会导致编译程序无法计算准确的存储空间需求.
主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略
JVM垃圾回收器和内存分配策略
对操作系统课程中的内存分配策略进行粗略的模拟,包括内存块的分配、回收等。内存块信息使用双向链表进行存储,对数据结构中链表的操作也是一个很好的复习。
JAVA 垃圾收集器与内存分配策略.rar
JVM垃圾回收器和内存分配策略
笔记,2、垃圾回收器和内存分配策略3
笔记,2、垃圾回收器和内存分配策略1
嵌入式系统动态内存分配策略与实现,仇文庆,夏路易,在嵌入式系统中出于对动态内存分配实时性、高可靠性和高效性的要求,本文提出了一种动态内存分配策略,并由此策略构建了一个程序
一个测试ACE各种内存分配策略效率的程序.doc
操作系统可变分区存储管理方式的内存分配和回收,可变分区调度算法有:最先适应分配算法,最优适应分配算法,最坏适应算法 用户提出内存空间的申请;系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,...
本文分析了Java中堆内存与栈内存分配的异同
利用可变分区的首次适应算法模拟内存的分配和回收。用C++语言,采用了双链表结构。
文章目录内存回收引用计数法可达性分析浅谈引用强引用软引用弱引用虚引用方法区GC 算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark...为什么要了解GC(Garbage Collection)和内存分配策略 1、面
用首次适应算法编程实现对操作系统内存动态分区分配,主要功能包括分配内存和回收内存。
主要介绍了Java GC 机制与内存分配策略详解的相关资料,需要的朋友可以参考下
介绍了JAVA垃圾收集器与内存分配策略,需要了解的朋友可以参考下
因此,在嵌入式系统中,不可能采用通用操作系统的一些复杂而完善的内存分配策略,一般没有段页式的虚存管理机制;而是采用简单、快速的内存分配方案,其分配方案也因程序对实时性的要求而异。例如,VxWorks系统采用...
主要介绍了浅谈Java内存区域划分和内存分配策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Windows内存管理