`
robinjoe
  • 浏览: 44897 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Java高级进阶学习-Java的内存回收(1)

阅读更多
面几遍文章中,阿堂想和朋友们一起来探讨一个java中内存管理方面的一些细节和常见内存管理的小技巧。由于java中本身已经提供了垃圾回收机制,并且这个是由JVM来自动执行的,也就是说,当一个java对象失去引用时,JVM的垃圾回收机制会自动清理它们,并回收它们所占用的内存空间。正因为此,所以一般的java程序员,就完全相信了java承诺的垃圾回收的说法了,这样就导致了java的内存泄露更隐蔽。。实际上,java的内存泄漏,也是一个比较常见的情况了。一个内存泄露点导致的内存泄露可能并不多,但并发用户一多,运行时间一长后,内存泄露就显得比较可怕了...
  Java的内存管理包括内存分配(创建java对象)和内存回收这两个方面。这两方面都是由java的jvm来自动完成的,因此降低了java程序员的学习难度,以致很多的java程序员不再关心程序内存分配。但这方面的工作也加重了jvm的工作,从而使java程序运行缓慢.
  对于JVM的垃圾回收机制来说,回收一个对象的标准在于:是否还有引用变量引用该对象?只要有引用变量引用该对象,垃圾回收机制就不会加收它。也就是说,当java对象被创建出来之后,垃圾回收机制会实时地监控每一个对象的运行状态,包括对象的申请,引用,被引用,赋值等。当垃圾回收机制实时地监控到某个对象不再被引用变量引用时,立即回收机制就会回收它所占用的空间。(转者注:java的GC是很懒的,也就是说当一个对象不被引用后,GC不会立即回收这个资源,原文提到的“立即回收机制就会回收它所占用的空间”,个人认为所谓GC很懒是说GC的监控不是即时的,但是一旦监测到需要回收的资源,就会立刻执行回收。望前辈指点。)
  JVM内存中的对象引用,可以被理解成一种有向图:即引用变量,对象都被当成有向图的顶点,引用关系当成图的有向边,有向边总是从引用端指向被引用的java对象。或者说是从引用变量可达对象.

其示意图如下所示

Java高级进阶学习-Java的内存回收(1)

Java高级进阶学习-Java的内存回收(1)

 

如下代码

Java高级进阶学习-Java的内存回收(1)

 


它们运行后,在栈区和堆内存区又是怎么样一个图示呢?相信朋友们,通过,看阿堂上面的两个图示的说明后,就可以很快得出结论了,正确结果图如下
Java高级进阶学习-Java的内存回收(1)



也就是说图示里的--“第三个Node对象”--将会有机会被回收。(转者注)


  对于垃圾回收机制来说,判断一个对象是否可回收的标准就在于该对象是否被引用,因此引用也是JVM进行内存管理的一个重要概念。为了更好的管理对象的引用,从JDK1.2开始,在java.lang.ref包下提借了三个类SoftReference,PhantomaReference和WeakReference。它们分别代表了系统对对象的3种引用方式:软引用,虚引用和弱引用。

 

转自:http://hi.baidu.com/javabbs/blog/item/90fbdf17a862c504c93d6d83.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics