0 0

jvm垃圾收集的问题5

VM参数:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8 -XX:-HandlePromotionFailure

这里是主要代码:
        allocation1 = new byte[2 * _1MB];  //分配2MB,下面一样
        allocation2 = new byte[2 * _1MB]; 
        allocation3 = new byte[2 * _1MB]; 
        allocation1 = null; 
        allocation4 = new byte[2 * _1MB];    //到这里就有YGC了,新生代不是有9MB可以用么?


[GC [DefNew: 6471K->135K(9216K), 0.0042747 secs] 6471K->4231K(19456K), 0.0043168 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

问题补充:首先,新生代可以的是9MB吧?
前面的三次new 占掉了6MB空间,如果说是jvm容器加载的时候其他的东西的内存,那么至少有1MB以上吧?不然再次new 2MB的时候怎么会产生垃圾收集呢?这里的其他东西的内存可以举个例子么?谢谢!


另外,这里的Minor GC发生的时候,还没有退出当前作用域,所以Minor GC后的2M和新请求的2M进入了老年代。4M / 10M = 40%
-----------------------------------------------
4MB应该是Minor GC后存活的对象吧?新请求的应该是在新生代吧?

问题补充:顺便再提一个问题:无论是复制算法还是标记-整理算法都对堆里的对象进行了移动,而Java用的是直接指针,这些指针有些在堆里,有些在栈上。GC的时候做了什么,才保证了这些指针指向正确的对象呢?
JVM 
2012年6月20日 21:17

4个答案 按时间排序 按投票排序

0 0

采纳的答案

刚开始就已经用了2MB了

	public static final int _1MB = 1024 * 1024;

	@SuppressWarnings("unused")
	public static void main(String ars[]) throws InterruptedException {
		showMemory();
		byte[] a = new byte[2 * _1MB];
		showMemory();
		byte[] b = new byte[2 * _1MB];
		showMemory();
		byte[] c = new byte[2 * _1MB];
		showMemory();
		byte[] d = new byte[2 * _1MB];
		showMemory();
		a = null;
		showMemory();
		byte[] e = new byte[2 * _1MB];
		showMemory();
	}

	private static void showMemory() throws InterruptedException {
		long total;
		long free;
		total = Runtime.getRuntime().totalMemory();
		free = Runtime.getRuntime().freeMemory();
		System.out.println("total:" + total + "\tfree:" + free + "\tused:"
				+ (total - free));
		Thread.sleep(1000);
	}

2012年6月25日 08:48
0 0

[GC [PSYoungGen: 6472K->152K(9216K)] 6472K->4248K(19456K), 0.0056470 secs] [Times: user=0.00 sys=0.01, real=0.01 secs]

这个可以看出来,垃圾回收以后,还剩下了152k的空间被占据。
所以,你这个实验中,没有流出这个空间来。
再分配2M的时候正好不够了。

另外,这里的Minor GC发生的时候,还没有退出当前作用域,所以Minor GC后的2M和新请求的2M进入了老年代。4M / 10M = 40%
PSOldGen        total 10240K, used 4096K [0xb2450000, 0xb2e50000, 0xb2e50000)
  object space 10240K, 40% used [0xb2450000,0xb2850020,0xb2e50000)

最后,不要用ide。因为ide加入了一些别的参数(可能)。例如我这里的ide的结构就和上面不同:不是152了!
[GC [PSYoungGen: 8192K->442K(9216K)]

2012年6月21日 16:28
0 0

我刚测试了下,确实是gc了
原因是在jvm容器加载的时候其他的东西还需要内存

2012年6月21日 14:47
0 0

young:from:to:old
内存是这样的(from,to)都是Survivor
XX:SurvivorRatio=8
young:from=8:1
from:to=1:1

所有young=(8/10)*10M=8M

2012年6月21日 10:34

相关推荐

    深入理解JVM垃圾收集算法与垃圾收集器

    深入理解JVM垃圾收集算法与垃圾收集器

    直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势、及使用场景

    【JVM垃圾收集器概述】 Java虚拟机(JVM)的垃圾收集器是自动管理内存的重要组成部分,负责识别不再使用的对象并释放它们所占用的内存,以防止内存泄漏。垃圾收集器的选择和配置对应用程序的性能有着显著影响,特别...

    7种JVM垃圾收集器特点-优劣势-及使用场景.pdf

    "JVM垃圾收集器特点、优劣势及使用场景" JVM垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,负责回收Java程序中不再使用的对象,以避免内存泄漏和提高程序性能。Java中有多种垃圾收集器,每种垃圾收集器...

    JVM垃圾收集器全面详解

    Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存...

    04-VIP-JVM垃圾收集器详解1

    在Java世界中,JVM垃圾收集器是内存管理的重要组成部分,负责自动回收不再使用的对象,以释放内存空间。垃圾收集器的选取并非一成不变,而是需要根据具体应用的需求和环境来定制。本文将详细解析几种常见的JVM垃圾...

    JVM垃圾回收机制

    JVM垃圾回收机制包含以下几种典型的垃圾收集算法: - 标记-清除算法:先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。这种方法简单但效率低下,且会产生大量内存碎片。 - 复制算法:将内存...

    JVM垃圾收集器详解

    【JVM垃圾收集器详解】 Java虚拟机(JVM)中的垃圾收集器是负责自动管理内存,特别是Java堆和方法区中的对象实例。它的主要任务是识别并清理不再使用的对象,以便释放内存资源。垃圾收集涉及到三个核心问题:确定...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路; 4、基础知识讲解透彻、详尽; 5、JVM零基础也能听懂。 第一节:学习JVM的意义和目标 1.1 意义: 1.2 目标: 第二节:JVM内存模型 1.1 概念 1.2 ...

    JVM初探- 内存分配、GC原理与垃圾收集器

    JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、...通过对内存分配策略、对象生死判定、垃圾收集算法和垃圾收集器的理解与应用,可以更好地掌握JVM的内存管理,从而提升应用性能和稳定性。

    JVM高级特性之垃圾收集-黄泽忠.rar

    黄泽忠的资料深入探讨了这个主题,以下是对JVM垃圾收集的详细解析。 首先,理解JVM内存结构是至关重要的。Java内存分为堆内存和栈内存。堆内存主要存放对象实例,而栈内存用于存储方法调用时的局部变量、方法参数等...

    java毕业设计-JVM内存模型和垃圾收集PPT37页-JVM内存模型和垃圾收集

    jvm--java毕业设计-JVM内存模型和垃圾收集PPT37页--JVM内存模型和垃圾收集

    JVM内存模型和垃圾收集.pdf

    ### JVM内存模型与垃圾收集详解 ...合理地设置JVM参数,选择合适的垃圾收集器,能够有效避免内存溢出等问题,提高程序的响应速度和并发能力。在未来的技术实践中,不断探索和调整这些参数将是提升系统性能的关键。

    Java理论与实践:JVM 1.4.1中的垃圾收集

    本文介绍了分代垃圾收集是结合了JVM 1.2及以后版本使用技术的长处,使结果对象分配开销非常小。并简单概述了老对象和年轻对象、分代收集、小的收集、代间引用、跟踪代间引用、卡片标记、JDK 1.4.1 默认收集器、并行...

    JvmGC收集器

    在 Java 虚拟机中,GC(Garbage Collection)收集器是 JVM 的一个重要组件,它负责回收 Java 应用程序中的垃圾对象,从而维持应用程序的性能和可靠性。JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 ...

    JVM垃圾回收原理

    ### JVM垃圾回收原理详解 #### 一、相关概念与基本回收算法 在深入探讨JVM垃圾回收机制之前,我们先了解几个重要的概念及其工作原理。 ##### 1. 引用计数(Reference Counting) 引用计数是一种较为古老且简单的...

    JVM高级特性之垃圾收集.pdf

    在Java虚拟机(JVM)中,垃圾收集(GC)是管理和回收不再使用的对象内存的过程。为了深入理解JVM的垃圾收集特性,首先需要对JVM的整体架构有所了解。JVM是支持Java程序运行的虚拟机,它能够在各种硬件平台和操作系统...

    JVM的垃圾回收机制详解和调优

    JVM的垃圾回收机制是Java性能优化的关键,理解不同阶段和区域的内存分配、选择合适的垃圾收集器以及合理调整参数,可以有效提高系统性能,减少应用停顿时间,从而提升用户体验。对于大型分布式系统,深入理解JVM的GC...

    JVM内存模型以及垃圾收集策略解析

    总的来说,理解和掌握JVM内存模型及垃圾收集策略对于优化Java应用程序的性能至关重要。开发者需要根据应用特点调整内存参数,选择合适的垃圾收集策略,以避免内存溢出、提高系统效率并确保程序的稳定运行。

Global site tag (gtag.js) - Google Analytics