public class GcTest { public void localvarGc1() { byte[] a = new byte[6*1024*1024]; System.gc(); } public void localvarGc2() { byte[] a = new byte[6*1024*1024]; a=null; System.gc(); } public void localvarGc3(){ { byte[] a = new byte[6*1024*1024]; } System.gc(); } public void localvarGc4() { { byte[] a = new byte[6*1024*1024]; } int c = 10; System.gc(); } public void localvarGc5() { localvarGc1(); System.gc(); } public static void main(String[] args) { GcTest ins = new GcTest(); ins.localvarGc1(); } }
在上述代码中,每一个localvarGcN()函数都分配了一块6MB的堆空间,并是用局部变量引用这块空间。
在localvarGc1()中,在申请空间后,立即进行垃圾回收,很明显,由于byte数组被变量a引用,因此无法回收这块空间。
在localvarGc2()中,在垃圾回收前,先将变量a置为null,使byte数组失去强引用,姑垃圾回收可以顺利回收byte数组。
对于localvarGc3(),在进行垃圾回收前,先使局部变量a失效,虽然变量a已经离开了作用域,但是变量a依然存在于局部变量表中,并且也指向这块byte数组,故byte数组依然无法被回收。
对于localvarGc4(),在垃圾回收之前,不仅使变量a失效,更是申明了变量c,使变量c复用了变量a之前的栈,由于变量a此时被销毁,姑垃圾回收器可以顺利回收byte数组。
对于localvarGc5(),它首先调用了localvarGc1(),很明显,在localvarGc1()中并没有释放byte数组,但在localvarGc1()返回后,它的栈帧被销毁,自然也包含了栈帧中的所有局部变量,故byte数组失去引用,在localvarGc5()的垃圾回收中被回收。
在启动jvm虚拟机的时候可以使用参数-XX:+PrintGC执行上述几个函数,在输出的日志中,可以看到垃圾回收前后堆的大小,进而推断byte数组是否被回收。下面的输出是函数localvarGc4()的运行结果:
从日志中可以看到,堆空间从回收前的6809k变为回收后的600k,释放了约6MB空间。进而可以推断,byte数组已被回收释放。
下面是函数localvarGc1()的运行结果:
可以看出堆空间几乎没有变化。
相关推荐
### Java高级之垃圾回收机制详解 #### 一、引言 在现代软件开发中,Java因其平台无关性、丰富的库支持以及自动内存管理等特性,成为企业级应用开发的首选语言之一。其中,垃圾回收机制(Garbage Collection, GC)是...
Java 内存管理与垃圾回收是Java编程中至关重要的概念,它们确保了程序的稳定运行和内存的有效利用。Java在JVM(Java Virtual Machine)上运行,内存主要分为两个主要区域:栈(Stack)和堆(Heap)。 栈主要用于...
### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...
- **Java栈(JVM Stack)**:用于存储局部变量、操作数栈等。 - **本地方法栈(Native Method Stack)**:与Java栈类似,但服务于本地方法调用。 - **堆(Heap)**:存放所有对象实例的地方,是垃圾回收的主要场所。 - **...
这种收集器的目标是最大化程序运行时间,减少垃圾回收对程序性能的影响。 ##### 3.3 CMS Collector CMS (Concurrent Mark Sweep) 收集器是一种以获得最短回收停顿时间为目标的收集器,非常适合那些不允许暂停时间过...
- **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态变量和JVM栈中的对象引用)的对象,来判断哪些对象是可达的,哪些是不可达的。不可达的对象被视为垃圾。 - **标记-清除算法**:这是最基础的...
Java编程语言中有三种主要的变量类型:成员变量(也称为实例变量)、类变量(也称为静态变量)和局部变量。理解这些变量之间的区别是学习Java基础的重要部分,这对于编写高效、可维护的代码至关重要。 1. 成员变量...
2. 可达性分析:现代Java垃圾回收主要采用可达性分析,通过分析根集(如局部变量、静态变量、系统运行所需对象等)能否到达某个对象,如果不能到达,则认为该对象不可达,可以被回收。 三、垃圾回收的阶段 1. 标记...
### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:...通过对内存管理的理解和垃圾回收机制的学习,开发者能够更好地编写高效、稳定的Java程序,并有效避免内存泄漏等问题的发生。
这一设计确保了垃圾回收不会对正在运行的应用程序造成显著的性能影响,同时也能有效避免内存碎片和内存溢出等问题。 #### 二、对象的失去引用与垃圾回收触发条件 Java中,对象失去引用是垃圾回收的关键触发条件之...
### Java垃圾回收技术详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制(Garbage Collection, GC)是面试和技术交流中经常提及的话题之一。尤其对于那些深入研究Java内存...
### Java垃圾回收机制详解 #### 一、垃圾收集的意义及背景 在计算机编程领域,特别是对于内存管理方面,Java提供了一种与C++等其他语言截然不同的方式。在C++中,对象所占用的内存资源需要程序员手动管理,这意味...
Java 局部变量与成员变量的区别 Java 编程语言中,变量是非常重要的一部分,它们可以存储不同的数据类型的值,並在程序中发挥着重要的作用。在 Java 中,变量可以分为两大类:局部变量和成员变量。这两种变量有着...
JAVA内存模型与垃圾回收是Java开发中至关重要的概念,它们直接影响到程序的性能和稳定性。首先,我们来看看Java内存模型。 Java内存模型,通常被称为JVM内存模型,它定义了程序中不同部分如何访问和共享数据。在...
总的来说,Java内存与垃圾回收调优是一项复杂而细致的工作,需要对JVM内存结构、垃圾回收机制以及相关工具和参数有深入理解。通过合理配置,我们可以显著提升应用性能,避免内存泄漏和长时间的垃圾收集导致的系统...