Java学习笔记---垃圾回收机制

相比于C/C++的编程语言,回收已经分配的内存是一件比较困难的事情,因为我们并不是总是知道内存应该在什么时刻被释放。如果分配的内存没有及时回收,就会导致系统运行速度的下降,严重的会导致系统瘫痪,也就是所谓的内存泄漏。
回收已经分配好的内存为什么是一件比较困难的事情呢?个人觉得有两点:一,忘记及时回收无用的内存,从而导致内存泄漏,降低性能;二,错误地回收程序核心类库的内存,从而导致系统崩溃。相信很多人在使用C语言时候,有时候自信满满的去释放某个空间,结果运行时出现断错误的,就是很有可能你释放的那个空间是系统的核心空间。
而Java语言则不需要程序员直接控制内存的释放了,内存的分配和回收全都交给JRE在后台完成。JRE会负责回收不再使用的内存,这种机制我们就成为垃圾回收(GC)。一般情况下,JRE会在后台开一个线程进行检测和控制,一般都是在CPU空闲或者内存不足的时候自动进行回收,所以程序员是无法控制回收的时间和顺序的。
Java的堆内存是一个运行时数据区,用来保存类的实例,Java虚拟机的堆内存中存储着都是正在运行的应用程序所建立的所有对象,所有的这些对象的回收有垃圾回收来负责。
垃圾回收可以自动释放内存空间,这样就能够很好的提高编程的负担,它的优势就体现出来了:一,编程的效率提高了,在没有垃圾回收机制时,需要花费大量的时间来解决存储器的问题,恰巧这是一个很难懂的问题;二,保护程序的完成,垃圾回收是Java语言安全性策略的重要部分。
有优势必然会有缺点,Java的垃圾回收的缺点在于它本身的开销会影响程序的性能。既然能够自动回收不需要的内存空间,必然需要跟踪程序中有用的对象,才可以确定哪些对象是无用的,并释放这些无用的对象。这个跟踪的操作势必要占用处理器的时间。其次现在的垃圾回收算法也不是很完备,有时候某个内存空间永远都不会被回收。不过随着时间的推移,算法肯定会不断的改进完善,这些问题也都可以被解决。
我们可能不知道JVM采用的是哪种垃圾回收算法,是定时回收?CPU空闲时回收?还是在内存空间不足时回收?不知道,但是不管采用哪种算法,有两个步骤是必须完成的:1,发现无用的对象;2,回收被无用对象占用的内存空间,使该空间可以被程序再次使用。
一般情况,垃圾回收具有下面几个特点:
一,垃圾回收机制的工作目标是回收无用对象占用内存空间,这些内存空间都是JVM堆内存里的内存空间,垃圾回收也只能回收内存资源,对其他物理资源是无法回收的,像数据库连接,IO等资源就无能为力了。
二,有时候为了让垃圾回收机制更快的回收哪些不再使用的对象,可以用暗示的方法,将该对象的引用变量设置为null。
三,垃圾回收发生的时间不确定性。不同的JVM采用不同的垃圾回收机制和不同的垃圾回收算法,就像上面所说,可能定时回收,可能CPU空间时回收,可能内存不足时回收,这个和垃圾回收实现机制的选择和设置都有关系。虽然可以调用Runtime对象的gc()方法或者System.gc()的方法来来建议系统进行垃圾回收,但这也只是建议而已,具体什么时候执行垃圾回收也还是无法控制的。
四,垃圾回收的精确性有两个方面:1,能够精确的标记活着的对象,这个完全回收所有废弃对象的前提;2,能够精确的定位对象之间的引用关系,这是实现归并和复制等算法的必要条件,通过这种引用关系,可以保证所有对象都能被可靠的回收,都能被重新分配,减少内存碎片的产生。
为了提高性能,一个基本的原则:对于不再需要的对象,就不要在引用它们。如果保持对这些对象的引用,垃圾回收机制就不会回收该对象,则会导致系统可用内存越来越少,系统的性能就不断的下降。
对了,顺便提一句,Java 8删除了HotSpot JVM中的PermGen(永生代内存,主要用于存储一些需要常驻内存,通常不会被回收的信息),改用本地内存来存储类的元数据信息,不知道这是不是暗示着将来不会碰到java.lang.OutOfMemoryError:PermGen错误了呢?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值