`
minijack
  • 浏览: 21555 次
  • 性别: Icon_minigender_1
  • 来自: 江苏泰州
最近访客 更多访客>>
社区版块
存档分类
最新评论

java技术之GC

阅读更多
GC之我见: 

在java中内存释放是由java虚拟机来完成的,只需要在使用时申请空间就行,而不需要考虑回收的事。具体的话,jvm中垃圾回收机制有很多种,其中最主要的一个算法叫做引用计数法。在java世界里,内存主要的分为两个部分,一个是堆,一个是栈,当new一个对象时,我们一般会把对象存到堆中,而对对象的引用放到栈里。当对某个对象的引用增加时,计数器就加1,减少时计数器就减掉1.当检测到计数器为0时,表示该对象不再使用时,java虚拟机会自动将其回收。

当然jvm也不是对计数器为0的立即回收,只是把它回收队列里面去。Java虚拟机中还有其他的相关算法会权衡一下它的时间与空间方面的问题,所以不会立即回收他。有时候我们确定一个对象已经使用完后,我们也可以通过system。Gc()来加速该对象的回收。

Jvm垃圾回收很方便,但是也有他自身的缺点,负责垃圾回收的线程优先级是10,在java中属于最低的优先级,由于他不能够对不再使用的对象立即回收,有时候也会产生内存泄露的问题,所有我们在编码过程中,可以有两种方法加快它的回收。一种方法就是,对一个对象使用完成后,将这个对象设计为null值,这样jvm会很快的对其进行回收。还有一个就是使用system。Gc()能够加重该对象被回收的权重,从而加快它的回收。

一.谁在做Garbage Collection?

在C++里,释放内存是手动处理的,要用delete运算符来释放分配的内存。这是流行的说法。确切地说,是应用认为不需要某实体时,就需用delete告诉系统,可以回收这块空间了。这个要求,对编码者来说,是件很麻烦、很难做到的事。随便上哪个BBS,在C/C++版块里总是有一大堆关于内存泄漏的话题。
Java采用一种不同的,很方便的方法:Garbage Collection。Java垃圾回收机制放在JVM里。JVM完全负责垃圾回收事宜,应用只在需要时申请空间,而在抛弃对象时不必关心空间回收问题。

二.对象在啥时被丢弃?

在C++里,当对象离开其作用域时,该对象即被应用抛弃。
是对象的生命期不再与其作用域有关,而仅仅与引用有关。
Java的垃圾回收机制一般包含近十种算法。对这些算法中的多数,我们不必予以关心。只有其中最简单的一个:引用计数法,与编码有关。
一个对象,可以有一个或多个引用变量指向它。当一个对象不再有任何一个引用变量指向它时,这个对象就被应用抛弃了。或者说,这个对象可以被垃圾回收机制回收了。
这就是说,当不存在对某对象的任何引用时,就意味着,应用告诉JVM:我不要这个对象,你可以回收了。
JVM的垃圾回收机制对堆空间做实时检测。当发现某对象的引用计数为0时,就将该对象列入待回收列表中。但是,并不是马上予以销毁。

三.丢弃就被回收?

该对象被认定为没有存在的必要了,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。
但是,并不是对象被抛弃后当即被回收的。JVM进程做空间回收有较大的系统开销。如果每当某应用进程丢弃一个对象,就立即回收它的空间,势必会使整个系统的运转效率非常低下。
前面说过,JVM的垃圾回收机制有多个算法。除了引用计数法是用来判断对象是否已被抛弃外,其它算法是用来确定何时及如何做回收。JVM的垃圾回收机制要在时间和空间之间做个平衡。
因此,为了提高系统效率,垃圾回收器通常只在满足两个条件时才运行:即有对象要回收且系统需要回收。切记垃圾回收要占用时间,因此,Java运行时系统只在需要的时候才使用它。因此你无法知道垃圾回收发生的精确时间。

四.没有引用变量指向的对象有用吗?

前面说了,没挂上引用变量的对象是被应用丢弃的,这意味着,它在堆空间里是个垃圾,随时可能被JVM回收。
不过,这里有个不是例外的例外。对于一次性使用的对象(有些书称之为临时对象),可以不用引用变量指向它。举个最简单也最常见的例子:
System.out.println(“I am Java!”);
就是创建了一个字符串对象后,直接传递给println()方法。

五.应用能干预垃圾回收吗?

许多人对Java的垃圾回收机制不放心,希望在应用代码里控制JVM的垃圾回收运作。这是不可能的事。对垃圾回收机制来说,应用只有两个途径发消息给JVM。第一个前面已经说了,就是将指向某对象的所有引用变量全部移走。这就相当于向JVM发了一个消息:这个对象不要了。第二个是调用库方法System.gc(),多数书里说调用它让Java做垃圾回收。
第一个是一个告知,而调用System.gc()也仅仅是一个请求。JVM接受这个消息后,并不是立即做垃圾回收,而只是对几个垃圾回收算法做了加权,使垃圾回收操作容易发生,或提早发生,或回收较多而已。
希望JVM及时回收垃圾,是一种需求。其实,还有相反的一种需要:在某段时间内最好不要回收垃圾。要求运行速度最快的实时系统,特别是嵌入式系统,往往希望如此。
Java的垃圾回收机制是为所有Java应用进程服务的,而不是为某个特定的进程服务的。因此,任何一个进程都不能命令Java垃圾回收机制做什么、怎么做或做多少。

六.对象被回收时要做的事

一个对象在运行时,可能会有一些东西与其关连。因此,当对象即将被销毁时,有时需要做一些善后工作。可以把这些操作写在finalize()方法(常称之为终止器)里。
protected void finalize() 
{ 
// finalization code here 
} 


这个终止器的用途类似于C++里的析构函数,而且都是自动调用的。但是,两者的调用时机不一样,使两者的表现行为有重大区别。C++的析构函数总是当对象离开作用域时被调用。这就是说,C++析构函数的调用时机是确定的,且是可被应用判知的。但是,Java终止器却是在对象被销毁时。由上所知,被丢弃的对象何时被销毁,应用是无法获知的。而且,对于大多数场合,被丢弃对象在应用终止后仍未销毁。
在编码时,考虑到这一点。譬如,某对象在运作时打开了某个文件,在对象被丢弃时不关闭它,而是把文件关闭语句写在终止器里。这样做对文件操作会造成问题。如果文件是独占打开的,则其它对象将无法访问这个文件。如果文件是共享打开的,则另一访问该文件的对象直至应用终结仍不能读到被丢弃对象写入该文件的新内容。
至少对于文件操作,编码者应认清Java终止器与C++析构函数之间的差异。
那么,当应用终止,会不会执行应用中的所有finalize()呢?据Bruce Eckel在Thinking in Java里的观点:“到程序结束的时候,并非所有收尾模块都会得到调用”。这还仅仅是指应用正常终止的场合,非正常终止呢?
因此,哪些收尾操作可以放在finalize()里,是需要酌酎的。


分享到:
评论

相关推荐

    gcviewer_1.3.4_执行程序与示例

    java -jar gcviewer_1.3.4.jar gc.log 或者 java -jar gcviewer_1.3.4.jar gc.log summary.csv chart.png 其中; gc.log 是截取的一部分样本日志文件; 建议使用你自己的日志。 GCViewer官网: ...

    [JAVA·初级]GC垃圾回收机制编程开发技术共14页.p

    [JAVA·初级]GC垃圾回收机制编程开发技术共14页.pdf.zip

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    关于java程序员发展需要学习的路线整理集合 技术 应用技术 计算机基础知识 cpu mem disk net 线程,进程 第三方库 poi Jsoup zxing Gson 数据结构 树 栈 链表 队列 图 操作系统 linux 代码控制...

    java 垃圾回收 机制详解

    说起垃圾收集(Garbage Collection,GC),大部分人都把这项技术当做Java语言的伴生产物。经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去...

    Java的GC机制探微.pdf

    Java的GC机制探微.pdf

    Java Garbage Collection 与各种GC算法.zip

    Java是一种广泛使用的面向对象的编程语言,由Sun ...综上所述,Java凭借其强大的特性和广泛的适用范围,在企业级应用、互联网服务、移动开发等领域均扮演着举足轻重的角色,是现代软件开发不可或缺的重要工具之一。

    java基础学习笔记 java整合技术 java工具类.rar

    健壮性:java的健壮性与自动垃圾回收机制有关,自动垃圾回收机制简称GC机制,java语言运行过程中产生的垃圾是自动回收的,不需要程序员关心。 可移植性:java程序可以做到一次编译,到处运行。在Windows操作系统上...

    JAVA垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    Java实时性及嵌入式实时Java处理器研究

    由于嵌入式系统多数为实时系统,传统Java技术应用于嵌入式系统的主要不足之处表现为:由于Java虚拟机是在运行中对引用到的类进行动态装载、解析和连接,影响了系统的实时性;垃圾收集器(GC)的自动运行导致了任务...

    java基础知识技术总结

    java.lang.System.gc();?/?java.lang.Runtime.gc(); 垃圾回收的建议语句,只能建议而不能强制回收 滨意: System.gc(); 是静态方滕,可直接踃用。 java.lang.Runtime.gc(); 不是静态方滕,不能直接在main方滕里踃用 ...

    corejava基础重要知识点总结

    会被gc回收掉 -》 零引用内存回收 属性:对象有什么 方法:对象会什么 5: 动态更新 对于Sun公司官方提供的一些核心方法 值保留一个指向的关系 当若干年后核心类库升级了 我们的程序还是可以正常执行 这是挤兑...

    JAVA技能树(技术面试知识点汇总)

    JAVA面试技能点总结,深入源码及原理分析,设计JAVA基础、多线程、同步机制、JAVA虚拟机、GC、异常、反射、SPRING事务原理、MYSQL存储引擎及原理、REDIS、EHCACHE、MYCAT、KAFKA、MQ等

    jvm和GC演讲ppt

    此文档是本人在公司做技术分享,个人做的ppt。如果有同学需要做jvm和gc技术演讲得,可以参考此文档。

    优化Java堆内存大小的五个技巧

    GCJava性能调优JVMHeapJava编程语言 摘要:Java堆容量不足可以对性能造成很大影响,这样无疑就给程序带来不可必要的麻烦,本文总结了影响Java堆容量不足的五大原因以及巧妙地去优化? 本文作者Pierre是一名有10...

    Java问题定位技术.pdf

    目录 1.Java线程堆栈分析 2.通过Java线程堆栈进行性能瓶颈分析 3.Java内存泄漏分析和堆内存设置 ...J gcviewer K IBM JDK下定位引起CoreDump的JIT方法 L 如何解读Java Core 文件? M 几个奇怪的现象 N 感谢TEX

    详细介绍Java垃圾回收机制

    垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再...

    Java程序员面试宝典 PDF 参考资料.rar

    Java程序员面试宝典 pdf,内容涉及String、Servlet、int 和 Integer的区别、、String 和StringBuffer的区别、运行时异常与一般异常有何异同、Servlet的生命周期、、EJB的技术实现、、Collection 和 Collections的...

    java jvm-old gc耗时几十s,导致系统告警(csdn)————程序.pdf

    java jvm-old gc耗时几十s,导致系统告警(csdn)————程序

Global site tag (gtag.js) - Google Analytics