/* 程序1 */ package org.lgy.study.gc; public class GcTest{ public static void main(String[] args){ for(int i = 0; i < 4; i++){ new GcTest(); } } public void finalize() throws Throwable{ System.out.println("finalize..."); } } /* -verbose:gc选项可以输出垃圾收集的 详细信息。 即使使用 java -verbose:gc org.lgy.study.gc.GcTest 命令运行上面的程序, 程序也不会有任何输出,这是因为从程序开始执行,直至程序结束都没执行垃圾回收。 */
/* 程序2 */ package org.lgy.study.gc; public class GcTest{ public static void main(String[] args){ for(int i = 0; i < 4; i++){ new GcTest(); System.gc(); /* try{ Thread.sleep(2000); }catch(Exception e){ e.printStackTrace(); } */ } } public void finalize() throws Throwable{ System.out.println("finalize..."); } } /* -verbose:gc选项可以输出垃圾收集的 详细信息。 使用 java -verbose:gc org.lgy.study.gc.GcTest 命令运行上面的程序,可能的结果: 结果1: [GC 655K->624K(61440K), 0.0013393 secs] [Full GC 624K->467K(61440K), 0.0116851 secs] [GC 467K->563K(61440K), 0.0004788 secs] [Full GC 563K->467K(61440K), 0.0070315 secs] [GC 467K->563K(61440K), 0.0004662 secs] [Full GC 563K->467K(61440K), 0.0068475 secs] [GC 467K->563K(61440K), 0.0004441 secs] [Full GC 563K->467K(61440K), 0.0070011 secs] finalize... 结果2: [GC 655K->680K(61440K), 0.0013204 secs] [Full GC 680K->467K(61440K), 0.0124876 secs] [GC 467K->563K(61440K), 0.0005451 secs] [Full GC 563K->467K(61440K), 0.0076125 secs] [GC 467K->563K(61440K), 0.0005278 secs] [Full GC 563K->467K(61440K), 0.0083511 secs] [GC 467K->563K(61440K), 0.0005080 secs] [Full GC 563K->467K(61440K), 0.0080329 secs] 这2种结果的区别在于: 结果1虽然运行了垃圾回收机制,但垃圾回收机制仅仅回收了最后一个垃圾对象所占用的内存空间。 结果2虽然运行了垃圾回收机制,但垃圾回收机制并没有回收任何垃圾对象所占有的内存空间。 出现这2中结果的原因可能是系统剩余的内存空间很够用,没有严重的内存需求, 同时原来的线程需要继续执行,所以即使运行了垃圾回收机制也没有回收垃圾内存。 */
/* 程序3 */ package org.lgy.study.gc; public class GcTest{ public static void main(String[] args){ for(int i = 0; i < 4; i++){ new GcTest(); System.gc(); System.runFinalization(); /* try{ Thread.sleep(2000); }catch(Exception e){ e.printStackTrace(); } */ } } public void finalize() throws Throwable{ System.out.println("finalize..."); } } /* -verbose:gc选项可以输出垃圾收集的 详细信息。 使用 java -verbose:gc org.lgy.study.gc.GcTest 命令运行上面的程序,可能的结果: [GC 655K->680K(61440K), 0.0013011 secs] [Full GC 680K->467K(61440K), 0.0121374 secs] finalize... [GC 1450K->563K(61440K), 0.0004457 secs] [Full GC 563K->467K(61440K), 0.0078861 secs] finalize... [GC 795K->563K(61440K), 0.0004989 secs] [Full GC 563K->467K(61440K), 0.0080416 secs] finalize... [GC 795K->563K(61440K), 0.0007512 secs] [Full GC 563K->467K(61440K), 0.0075044 secs] finalize... 这个程序和程序2相比,仅仅多了System.runFinalization();语句。 System和Runtime类里都提供了一个runFinalization()方法, 可以强制垃圾回收机制调用系统中可恢复对象的finalize方法。 */
/* 程序4 */ package org.lgy.study.gc; public class GcTest{ public static void main(String[] args){ for(int i = 0; i < 4; i++){ new GcTest(); System.gc(); try{ Thread.sleep(1000); }catch(Exception e){ e.printStackTrace(); } } } public void finalize() throws Throwable{ System.out.println("finalize..."); } } /* -verbose:gc选项可以输出垃圾收集的 详细信息。 使用 java -verbose:gc org.lgy.study.gc.GcTest 命令运行上面的程序,可能的结果: [GC 655K->584K(61440K), 0.0013026 secs] [Full GC 584K->467K(61440K), 0.0138399 secs] finalize... [GC 1450K->595K(61440K), 0.0006197 secs] [Full GC 595K->467K(61440K), 0.0084750 secs] finalize... [GC 467K->563K(61440K), 0.0005128 secs] [Full GC 563K->467K(61440K), 0.0081691 secs] finalize... [GC 467K->563K(61440K), 0.0004808 secs] [Full GC 563K->467K(61440K), 0.0073200 secs] finalize... 这个程序和程序2那个程序相比,仅仅是让当前线程暂停了1秒。 为什么执行结果和程序2不同呢?? 执行完System.gc();之后,程序暂停了。 JVM利用暂停的时间启动了垃圾回收机制,并回收了垃圾内, (因为在暂停的时间里,没有线程需要执行,所以JVM就启动了垃圾回收机制,并回收了垃圾内) */
相关推荐
其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...
垃圾回收(Garbage Collection, GC)是指在程序运行过程中自动检测并释放那些不再被使用的对象所占用的内存空间的过程。这一过程通常是由语言的运行环境(如Java虚拟机)自动完成的,而不需要程序员手动干预。 **2....
C#中的垃圾回收机制与Java类似,但有一些细节上的差异。例如,C#的.NET框架使用了不同的内存分区,称为堆(Heap)。堆分为大对象堆(Large Object Heap, LOH)和普通对象堆,LOH存储大对象,不参与常见的垃圾回收...
Java对象的清除与垃圾回收 Java中的垃圾回收机制是其主要特性之一,本文将介绍垃圾回收的概念和finalize()方法的使用。 一、垃圾回收的机制 Java虚拟机的垃圾回收机制是一种自动的内存管理机制。与C++不同,Java...
本书《垃圾回收的算法与实现》深入探讨了垃圾回收的算法和实际应用,是程序员理解和应用垃圾回收技术的重要参考书籍。 垃圾回收算法篇详细介绍了多种垃圾回收算法,包括标记-清除算法、引用计数法、复制算法、标记-...
Java垃圾回收器是Java虚拟机(JVM)的关键组成部分,它自动管理程序的内存,确保对象的生命周期得到妥善处理,从而避免内存泄漏。本章主要介绍了垃圾回收算法和JVM中实现的不同类型的垃圾回收器。 首先,垃圾回收的...
【标题】:“灵巧指针与垃圾回收” 在编程领域,尤其是在C++中,灵巧指针(Smart Pointer)和垃圾回收(Garbage Collection)是两个重要的概念,它们主要用于管理和释放内存,以防止内存泄漏。灵巧指针是C++标准库...
#### 对象的生命周期与垃圾回收触发条件 当使用`new`关键字创建一个对象后,并没有相应的`delete`操作来显式地释放该对象所占用的内存。在完成对某个对象的使用后,可以通过以下方式停止该对象的引用: - 将引用...
在编程领域,垃圾回收(Garbage Collection, GC)是一种自动管理内存的技术,它负责跟踪和回收不再使用的对象,以防止内存泄漏。C++作为一种静态类型、编译式的语言,其标准库并不内置垃圾回收机制,程序员需要手动...
这是最基础的垃圾回收策略,它为每个对象维护一个引用计数器,记录有多少个引用指向这个对象。当对象的引用计数变为0时,表示没有变量再使用这个对象,垃圾回收器就会回收这块内存。但这种机制对循环引用(两个或更...
牛客-数据存储与垃圾回收 本文将详细介绍JavaScript中的数据存储与垃圾回收机制,从数据类型、内存空间、垃圾回收机制等方面进行了深入探讨。 一、数据类型 JavaScript中有八种基本数据类型:Number、String、...
垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 垃圾回收机制的算法有多种,包括引用计数法、标记-清除算法、标记-整理算法、Copying算法和Generation算法等。 1. 引用...
Java和C#是两种流行的面向对象的编程语言,它们都具备自动内存管理机制,其中垃圾回收(Garbage Collection, GC)是一项核心功能。垃圾回收旨在自动检测并释放不再使用的内存,防止内存泄漏,确保程序的稳定运行。...
.NET 垃圾回收机制支持三代对象:第一代对象是最近创建的对象,第二代对象是经历过一次垃圾回收的对象,第三代对象是经历过两次以上的垃圾回收的对象。 在 .NET 中,垃圾回收机制可以分为两个阶段:标志阶段和紧缩...
Java 内存管理与垃圾回收是Java编程中至关重要的概念,它们确保了程序的稳定运行和内存的有效利用。Java在JVM(Java Virtual Machine)上运行,内存主要分为两个主要区域:栈(Stack)和堆(Heap)。 栈主要用于...
JVM 内存分配与垃圾回收详解 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,它提供了一个平台独立的方式来执行 Java 字节码。JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾...
可达性分析是另一种更复杂的垃圾回收方法,它通过跟踪对象间的引用关系来确定哪些对象是可达的,即仍然有路径可以从根对象(如全局变量、栈上的局部变量)访问到。不可达的对象被视为垃圾,可以被回收。这种方法能...
垃圾回收机制负责回收那些不再被程序使用、即无法达到的对象所占用的内存空间。我们通过深入探讨以下几个关键点来理解JVM垃圾回收机制的工作原理: 1. 如何确定某个对象是“垃圾”? JVM垃圾回收机制通过两种主要...