java 垃圾回收步步深入01----整体印象

                                             java 垃圾回收步步深入01----整体印象

一.总体概念

1.垃圾收集:不再使用的内存空间应该被回收

2.在C/C++语言中,垃圾回收由程序员负责

3.在Java中,它提供了一种系统级线程跟踪存储空间分配情况,在JVM空闲时,检查并释放可被释放的存储空间。垃圾收集在Java程序运行中是自动收集的,程序员无法干预。

4.垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身

5.System.gc()和Runtime.getRuntime().gc()
调用时用于 显式 通知JVM可以进行一次垃圾回收,但真正垃圾回收机制具体在什么时间点开始发生动作这同样是不可预料的

二.代码演示

protect void finalize() 来源于Object类

当垃圾收集器觉得一个内存空间无用时就调用finalize 来回收它。

public static void gc() 来源于System类

调用垃圾收集器

// 本类演示java的垃圾回收机制。
public class GarbageDemo {
    int index;// 保存对象的索引值。
    static int count = 0;// 记录当前产生了多少个对象。

    public GarbageDemo() {
        count++;
        System.out.println("第" + count + "个对象产生了");
        setIndex(count);
    }

    public void setIndex(int index) {
        this.index = index;
    }

    protected void finalize() {
        System.out.println("第" + index + "个对象被回收了");
    }

    public static void main(String[] args) {
        new GarbageDemo();
        new GarbageDemo();
        new GarbageDemo();
        new GarbageDemo();
        // 产生了四个GarbageDemo对象,因为new 一个对象之后,
        // 没有将这个对象的引用赋值给某一个变量,因此,这些对象
        // 所占用的内存没有被任何的变量所引用,因此这些对象就是一个垃圾了。

        System.gc();// 显示的运行垃圾收集器。没有这一句代码是看不见对象被回收的效果的。
    }
}

输出:

第1个对象产生了

第2个对象产生了

第3个对象产生了

第4个对象产生了

第3个对象被回收了

第4个对象被回收了

第2个对象被回收了

第1个对象被回收了

java 垃圾回收步步深入01----整体印象

时间: 2024-10-09 20:32:16

java 垃圾回收步步深入01----整体印象的相关文章

成为Java GC专家(3)—如何优化Java垃圾回收机制

本文作者: ImportNew - 王晓杰 未经许可,禁止转载! 本文是成为Java GC专家系列文章的第三篇.在第一篇<成为JavaGC专家Part I — 深入浅出Java垃圾回收机制>中我们学习了不同GC算法的执行过程,GC是如何工作的,什么是新生代和老年代,你应该了解的JDK7中的5种GC类型,以及这5种类型对于应用性能的影响. 在第二篇<成为JavaGC专家Part II — 如何监控Java垃圾回收机制>,我解释了JVM实际上是如何执行垃圾回收的,我们如何监控GC,以及

如何优化Java垃圾回收-zz

为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或行为: 已经通过 -Xms 和–Xmx 设置了内存大小 包含了 -server 参数 系统中没有超时日志等错误日志 换句话说,如果你没有设定内存的大小,并且系统充斥着大量的超时日志时,你就需要在你的系统中进行GC优化了. 但是,你需要时刻铭记一条:GC优化永远是最后一项任务. 你应该考虑一下进行GC

Java 垃圾回收机制概述

摘要: Java技术体系中所提倡的 自动内存管理 最终可以归结为自动化地解决了两个问题:给对象分配内存 以及 回收分配给对象的内存,而且这两个问题针对的内存区域就是Java内存模型中的 堆区.关于对象分配内存问题,笔者的博文<JVM 内存模型概述>已经阐述了 如何划分可用空间及其涉及到的线程安全问题,本文将结合垃圾回收策略进一步给出内存分配规则.垃圾回收机制的引入可以有效的防止内存泄露.保证内存的有效使用,也大大解放了Java程序员的双手,使得他们在编写程序的时候不再需要考虑内存管理.本文着重

成为JavaGC专家(3)—如何监控Java垃圾回收机制(转载)

原文:http://www.importnew.com/3146.html 为什么需要优化GC 或者说的更确切一些,对于基于Java的服务,是否有必要优化GC?应该说,对于所有的基于Java的服务,并不总是需要进行GC优化,但前提是所运行的基于Java的系统,包含了如下参数或行为: 已经通过 -Xms 和–Xmx 设置了内存大小 包含了 -server 参数 系统中没有超时日志等错误日志 换句话说,如果你没有设定内存的大小,并且系统充斥着大量的超时日志时,你就需要在你的系统中进行GC优化了. 但

java垃圾回收算法

(1)引用计数法 这是最经典和最古老的一种,它的工作原理是为每个对象配备一个计数器,只有这个对象被引用了,引用计数器就加1,当引用失效时,计数器减一,只要计数器为0,意味着不再被使用,于是该对象就可以被回收了. 优点:实现简单: 缺点:无法处理循环引用情况.即有应该被回收的垃圾对象A.B,他们互相引用,除此之外无其他引用,然而他们计数器值不是0,因此无法回收,从而造成内存泄漏. (2)标记-清除算法 这个算法将垃圾回收分为两个阶段,标记阶段和清除阶段,在标记阶段,首先通过根结点,标记所有从根结点

Java垃圾回收精粹 — Part1

Java垃圾回收精粹分4个部分,本篇是第1部分.在第1部分里介绍了权衡点.对象生命周期以及全局暂停事件. 串行.并行.并发.CMS.G1.年轻代(Young Gen).新生代(New Gen).旧生代(Old Gen).持久代(Perm Gen).伊甸区(Eden).年老区(Tenured).幸存区(Survivor Spaces).安全点(Safepoints)以及数百种JVM启动参数.当你试图调整垃圾回收器使你的Java应用程序获得需要的吞吐量和延迟时,这些会难倒你吗?如果回答是,你也不必担

Java垃圾回收精粹 — Part4

Java垃圾回收精粹分4个部分,本篇是第4部分.在第4部分里介绍了G1收集器.其他并发收集器以及垃圾收集监控和调优. Garbage First (G1) 收集器 G1 (-XX:+UseG1GC)收集器是一个新的收集器.G1随Java 6发布,在Java 7U4中得到正式支持.它是一个部分并发的收集算法,通过尝试小量增加全局暂停的方式压缩年老区,将FullGC降到最低.因为碎片引起的FullGC正是CMS的一大麻烦.G1也是分代收集器,但是它与其他收集器使用不同的堆组织方式.根据不同的用途,G

Java垃圾回收手册翻译 - 什么是垃圾回收

Java垃圾回收手册翻译 - 什么是垃圾回收 初看之下,垃圾回收应该要做其名称之事 - 找到和丢掉垃圾.然而事实上它正好做着相反的事,垃圾回收会记录所有仍在使用中的对象,然后将其他标记为垃圾.谨记这点,我们开始挖掘更多Java虚拟机如何实现被称为垃圾回收的自动化内存回收过程的细节. 为了避免一头扎进细节,我们从头开始,解释垃圾回收的一般性质以及核心概念和方法. 免责声明:本手册关注于Oracle Hotspot和OpenJDK的表现,其他运行时甚至其他虚拟机,比如jRockit或IBM J9,会

java垃圾回收机制整理

一.垃圾回收器和finalize() java垃圾回收器只负责回收无用对象占据的内存资源.但是如果你的对象不是通过 new 创建的(所有的new 对象都往堆中开辟资源,在一个地方,方便清理/管理资源),它会不知道该如果释放该对象的这块特殊内存.为了应对这个情况,Object自带一个finalize()方法. finalize()这方法的原理是:一旦垃圾回收器准备释放该对象占用的存储空间,将会先调用其继承/重写的fialize(),并且调用方法后不是立即执行回收,而是在下一次(JVM觉得需要更大内