-
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的时候做了什么,才保证了这些指针指向正确的对象呢?2012年6月20日 21:17
4个答案 按时间排序 按投票排序
-
采纳的答案
刚开始就已经用了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
-
[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
-
young:from:to:old
内存是这样的(from,to)都是Survivor
XX:SurvivorRatio=8
young:from=8:1
from:to=1:1
所有young=(8/10)*10M=8M2012年6月21日 10:34
相关推荐
深入理解JVM垃圾收集算法与垃圾收集器
【JVM垃圾收集器概述】 Java虚拟机(JVM)的垃圾收集器是自动管理内存的重要组成部分,负责识别不再使用的对象并释放它们所占用的内存,以防止内存泄漏。垃圾收集器的选择和配置对应用程序的性能有着显著影响,特别...
"JVM垃圾收集器特点、优劣势及使用场景" JVM垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,负责回收Java程序中不再使用的对象,以避免内存泄漏和提高程序性能。Java中有多种垃圾收集器,每种垃圾收集器...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存...
在Java世界中,JVM垃圾收集器是内存管理的重要组成部分,负责自动回收不再使用的对象,以释放内存空间。垃圾收集器的选取并非一成不变,而是需要根据具体应用的需求和环境来定制。本文将详细解析几种常见的JVM垃圾...
JVM垃圾回收机制包含以下几种典型的垃圾收集算法: - 标记-清除算法:先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。这种方法简单但效率低下,且会产生大量内存碎片。 - 复制算法:将内存...
【JVM垃圾收集器详解】 Java虚拟机(JVM)中的垃圾收集器是负责自动管理内存,特别是Java堆和方法区中的对象实例。它的主要任务是识别并清理不再使用的对象,以便释放内存资源。垃圾收集涉及到三个核心问题:确定...
2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路; 4、基础知识讲解透彻、详尽; 5、JVM零基础也能听懂。 第一节:学习JVM的意义和目标 1.1 意义: 1.2 目标: 第二节:JVM内存模型 1.1 概念 1.2 ...
JVM内存管理是Java虚拟机的核心机制之一,其主要包含对象的创建、内存分配、...通过对内存分配策略、对象生死判定、垃圾收集算法和垃圾收集器的理解与应用,可以更好地掌握JVM的内存管理,从而提升应用性能和稳定性。
黄泽忠的资料深入探讨了这个主题,以下是对JVM垃圾收集的详细解析。 首先,理解JVM内存结构是至关重要的。Java内存分为堆内存和栈内存。堆内存主要存放对象实例,而栈内存用于存储方法调用时的局部变量、方法参数等...
jvm--java毕业设计-JVM内存模型和垃圾收集PPT37页--JVM内存模型和垃圾收集
### JVM内存模型与垃圾收集详解 ...合理地设置JVM参数,选择合适的垃圾收集器,能够有效避免内存溢出等问题,提高程序的响应速度和并发能力。在未来的技术实践中,不断探索和调整这些参数将是提升系统性能的关键。
本文介绍了分代垃圾收集是结合了JVM 1.2及以后版本使用技术的长处,使结果对象分配开销非常小。并简单概述了老对象和年轻对象、分代收集、小的收集、代间引用、跟踪代间引用、卡片标记、JDK 1.4.1 默认收集器、并行...
在 Java 虚拟机中,GC(Garbage Collection)收集器是 JVM 的一个重要组件,它负责回收 Java 应用程序中的垃圾对象,从而维持应用程序的性能和可靠性。JvmGC 收集器是 JVM 中的三个主要 GC 收集器之一,分别是 ...
### JVM垃圾回收原理详解 #### 一、相关概念与基本回收算法 在深入探讨JVM垃圾回收机制之前,我们先了解几个重要的概念及其工作原理。 ##### 1. 引用计数(Reference Counting) 引用计数是一种较为古老且简单的...
在Java虚拟机(JVM)中,垃圾收集(GC)是管理和回收不再使用的对象内存的过程。为了深入理解JVM的垃圾收集特性,首先需要对JVM的整体架构有所了解。JVM是支持Java程序运行的虚拟机,它能够在各种硬件平台和操作系统...
JVM的垃圾回收机制是Java性能优化的关键,理解不同阶段和区域的内存分配、选择合适的垃圾收集器以及合理调整参数,可以有效提高系统性能,减少应用停顿时间,从而提升用户体验。对于大型分布式系统,深入理解JVM的GC...
总的来说,理解和掌握JVM内存模型及垃圾收集策略对于优化Java应用程序的性能至关重要。开发者需要根据应用特点调整内存参数,选择合适的垃圾收集策略,以避免内存溢出、提高系统效率并确保程序的稳定运行。