大对象直接进入老年代
大对象就是指需要大量连续空间的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过于频繁
分享到:
相关推荐
### JAVA中的内存分配策略 #### 一、内存分配的基本概念 在探讨JAVA中的内存分配策略之前,我们需要了解一些基本的概念。 - **静态存储分配**:指的是在编译时就能确定每个数据目标在运行时刻的存储空间需求,...
主要整理内容为:分析了垃圾收集的算法和JDK1.7中提供的7款垃圾收集器的特点以及运作原理。以及内存分配策略
《垃圾回收器与内存分配策略详解》 在Java编程中,理解垃圾回收(Garbage Collection,简称GC)机制和内存分配策略是至关重要的。GC的主要目的是自动管理内存,避免程序员手动进行繁琐且容易出错的内存释放工作。而...
在Java编程语言中,垃圾收集器(Garbage Collector, GC)和内存分配策略是至关重要的概念,它们确保了程序的高效运行和内存的有效管理。Java的自动内存管理系统使得程序员无需手动管理内存,而是由JVM(Java虚拟机)...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾回收器(Garbage Collector, GC),以及内存分配策略。理解这些概念对于优化Java应用性能至关重要。本篇文章将深入探讨JVM的垃圾回收机制以及...
《垃圾回收器与内存分配策略详解》 在Java编程中,理解垃圾回收(Garbage Collection,简称GC)机制和内存分配策略是至关重要的。GC的主要目的是自动管理内存,避免程序员手动进行繁琐且容易出错的内存释放工作。而...
对操作系统课程中的内存分配策略进行粗略的模拟,包括内存块的分配、回收等。内存块信息使用双向链表进行存储,对数据结构中链表的操作也是一个很好的复习。
一个测试ACE各种内存分配策略效率的程序.doc
在这个实验中,我们将聚焦于内存管理的基本概念,特别是内存分配策略,以及如何通过编程语言(如VC++)来模拟这些过程。 内存管理是操作系统的核心功能之一,它涉及内存的分配、回收、地址映射和保护等多个方面。...
### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...
### 操作系统内存分配策略与实现 #### 一、引言 在计算机科学领域,操作系统内存管理是一项核心功能,负责处理计算机系统中的物理内存资源,确保各种进程和应用程序能够高效、安全地使用内存。其中,内存分配算法...
### 可变分区存储管理方式的内存分配与回收 #### 概述 可变分区存储管理方式是一种在早期操作系统中广泛采用的内存管理技术。它通过动态地将内存划分为不同大小的分区来满足不同程序的内存需求。这种方式能够有效地...
"浅谈Java内存区域划分和内存分配策略" 本文将详细讲述Java内存区域划分和内存分配策略,涵盖程序计数器、虚拟机栈、本地方法栈、堆、方法区等内存区域的概念和作用,以及对象创建过程和内存分配策略。 程序计数器...
在操作系统的内存管理中,分页是一种常见的内存分配策略。它将连续的内存空间划分为固定大小的块,称为“页”,同时,进程的地址空间也被分割成同样大小的页。这样做的好处是可以将不连续的物理内存块分配给逻辑上...
2. **内存分配策略:** - **连续分配**:早期操作系统采用的方法,将内存连续划分给进程,包括单一连续分配(所有进程共享一块内存)和固定分区分配(预先划分固定大小的区域)。 - **非连续分配**:现代操作系统...
操作系统中的固定内存分配算法是管理计算机内存资源的一种策略,它主要关注如何有效地为进程...不过,现代操作系统更倾向于使用更灵活的内存分配策略,如动态内存分配,以更好地适应不同进程的需求和内存环境的变化。
轮转法(Round Robin)是一种简单的内存分配策略,常见于多进程或线程调度中。在Java中,虽然JVM并不直接支持轮转法进行内存分配,但可以通过模拟实现。例如,我们可以创建一个固定大小的内存池,然后按照预定义的...
本项目主要探讨了三种不同的内存分配策略:最先适应法、最佳适应法和最坏适应法。 最先适应法(First Fit)是最简单的分配策略。当一个新的进程请求内存时,操作系统会从内存分区的列表中顺序查找,一旦找到第一个...