新生代大小对GC的影响

Java内存溢出实验
import java.util.Vector;

/**
* Created by xxd on 2017/4/2.
*/
public class DumpOOM {
public static void main(String[] args){
Vector v = new Vector();
for (int i=0;i<25;i++){
v.add(new byte[1*1024*1024]);
}
}
}
"C:\Program Files\Java\jdk1.8.0_121\bin\java" -Xmx20m -Xms20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -Didea.launcher.port=7534 "-Didea.launcher.bin.path=E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;F:\idea_workspace\jvmDebug\out\production\jvmDebug;E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain NewSizeDemo
[GC (Allocation Failure) [PSYoungGen: 512K->504K(1024K)] 512K->512K(19968K), 0.0007921 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 1016K->488K(1024K)] 1024K->684K(19968K), 0.0006238 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Java HotSpot(TM) 64-Bit Server VM warning: NewSize (1536k) is greater than the MaxNewSize (1024k). A new max generation size of 1536k will be used. 
Heap
 PSYoungGen      total 1024K, used 582K [0x00000000ffe80000, 0x0000000100000000, 0x0000000100000000)
  eden space 512K, 18% used [0x00000000ffe80000,0x00000000ffe97bd0,0x00000000fff00000)
  from space 512K, 95% used [0x00000000fff80000,0x00000000ffffa020,0x0000000100000000)
  to   space 512K, 0% used [0x00000000fff00000,0x00000000fff00000,0x00000000fff80000)
 ParOldGen       total 18944K, used 10436K [0x00000000fec00000, 0x00000000ffe80000, 0x00000000ffe80000)
  object space 18944K, 55% used [0x00000000fec00000,0x00000000ff6310b0,0x00000000ffe80000)
 Metaspace       used 3305K, capacity 4494K, committed 4864K, reserved 1056768K
  class space    used 362K, capacity 386K, committed 512K, reserved 1048576K

Process finished with exit code 0

===================================================================================================================================================
-Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
"C:\Program Files\Java\jdk1.8.0_121\bin\java" -Xmx20m -Xms20m -Xmn7m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -Didea.launcher.port=7535 "-Didea.launcher.bin.path=E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;F:\idea_workspace\jvmDebug\out\production\jvmDebug;E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain NewSizeDemo
[GC (Allocation Failure) [PSYoungGen: 3343K->864K(5632K)] 3343K->1896K(18944K), 0.0025715 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 4056K->1520K(5632K)] 5088K->2820K(18944K), 0.0010995 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
[GC (Allocation Failure) [PSYoungGen: 4688K->1528K(5632K)] 5988K->2828K(18944K), 0.0006183 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 5632K, used 3707K [0x00000000ff900000, 0x0000000100000000, 0x0000000100000000)
  eden space 4096K, 53% used [0x00000000ff900000,0x00000000ffb20fa8,0x00000000ffd00000)
  from space 1536K, 99% used [0x00000000ffd00000,0x00000000ffe7e040,0x00000000ffe80000)
  to   space 1536K, 0% used [0x00000000ffe80000,0x00000000ffe80000,0x0000000100000000)
 ParOldGen       total 13312K, used 1300K [0x00000000fec00000, 0x00000000ff900000, 0x00000000ff900000)
  object space 13312K, 9% used [0x00000000fec00000,0x00000000fed45020,0x00000000ff900000)
 Metaspace       used 3269K, capacity 4494K, committed 4864K, reserved 1056768K
  class space    used 360K, capacity 386K, committed 512K, reserved 1048576K

Process finished with exit code 0
===================================================================================================================================================
-Xmx20m -Xms20m -Xmn15m -XX:SurvivorRatio=2 -XX:+PrintGCDetails
"C:\Program Files\Java\jdk1.8.0_121\bin\java" -Xmx20m -Xms20m -Xmn15m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -Didea.launcher.port=7536 "-Didea.launcher.bin.path=E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;F:\idea_workspace\jvmDebug\out\production\jvmDebug;E:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.3\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain NewSizeDemo
[GC (Allocation Failure) [PSYoungGen: 7627K->1920K(11776K)] 7627K->1928K(16896K), 0.0014507 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 11776K, used 6338K [0x00000000ff100000, 0x0000000100000000, 0x0000000100000000)
  eden space 8192K, 53% used [0x00000000ff100000,0x00000000ff550b58,0x00000000ff900000)
  from space 3584K, 53% used [0x00000000ff900000,0x00000000ffae0040,0x00000000ffc80000)
  to   space 3584K, 0% used [0x00000000ffc80000,0x00000000ffc80000,0x0000000100000000)
 ParOldGen       total 5120K, used 8K [0x00000000fec00000, 0x00000000ff100000, 0x00000000ff100000)
  object space 5120K, 0% used [0x00000000fec00000,0x00000000fec02000,0x00000000ff100000)
 Metaspace       used 3279K, capacity 4494K, committed 4864K, reserved 1056768K
  class space    used 361K, capacity 386K, committed 512K, reserved 1048576K

Process finished with exit code 0
===================================================================================================================================================

转载于:https://www.cnblogs.com/xxdfly/p/cf6bf5d185d8c2302a7c7154ce2bcb97.html

新生代垃圾回收(Young Generation Garbage Collection,简称Minor GC)是JVM垃圾回收机制中的重要组成部分,其触发条件主要与对象的内存分配行为和内存使用状态相关。以下是对新生代GC触发时机的详细分析: 1. **Eden区空间不足** 新生代通常被划分为一个较大的Eden区和两个较小的Survivor区(From和To)。大多数新创建的对象会被分配到Eden区。当Eden区的空间不足以容纳新对象时,JVM会触发一次Minor GC[^2]。 2. **大对象直接进入老年代** 如果某个对象大小超过了新生代中设定的阈值(由JVM参数`-XX:PretenureSizeThreshold`控制),该对象会直接分配到老年代。这种情况下,如果老年代的空间也不足,则可能触发Full GC而非单纯的新生代GC。但在某些场景下,为了为后续对象腾出空间,也可能先尝试进行一次Minor GC[^2]。 3. **长期存活的对象晋升到老年代** 在每次Minor GC过程中,存活下来的对象会在两个Survivor区之间来回复制,并且它们的年龄会增加。当对象的年龄达到一定阈值(默认为15,可通过`-XX:MaxTenuringThreshold`调整),它们会被晋升到老年代。如果Survivor区无法容纳所有存活对象,部分对象可能会提前晋升到老年代。这种情况下,若老年代空间不足,也可能间接影响新生代GC的行为。 4. **动态年龄判定规则** JVM在实际运行时还会根据Survivor区的使用情况动态调整对象晋升到老年代的年龄阈值。例如,如果当前Survivor区已经占用了一定比例的空间,那么即使对象的年龄未达到预设的最大值,也可能会被提前晋升到老年代。这种情况下的晋升也会促使更频繁的Minor GC发生以清理新生代[^2]。 5. **显式调用System.gc()** 虽然不推荐手动调用`System.gc()`,但该方法有可能触发包括新生代在内的整个堆内存的垃圾回收过程。不过,具体是否执行以及执行哪种类型的GC(如Full GC或仅Minor GC)仍由JVM根据当前内存状况决定[^1]。 6. **元数据区的压力反馈** 尽管元数据区(Metaspace)不属于堆内存的一部分,但如果元数据区出现压力(如类加载过多导致元数据区增长),某些JVM实现可能会通过Full GC来释放不再使用的类元数据,从而间接影响新生代GC的频率和行为。 ### 示例代码:模拟新生代GC的触发 以下是一个简单的Java程序,用于演示如何通过不断创建短生命周期对象来触发新生代GC: ```java public class YoungGCTest { private static final int _1MB = 1024 * 1024; public static void main(String[] args) { byte[] allocation1, allocation2, allocation3; // 分配三个1MB的对象,填满Eden区 allocation1 = new byte[2 * _1MB]; allocation2 = new byte[2 * _1MB]; allocation3 = new byte[2 * _1MB]; // 再次分配一个1MB对象,此时Eden区空间不足,将触发Minor GC allocation1 = new byte[2 * _1MB]; } } ``` 在这个示例中,连续分配多个大对象会导致Eden区快速填满,最终触发一次Minor GC来回收无用对象并释放空间。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值