Java的堆是一个运行时数据区,类的实例从中分配空间,堆中存储着正在运行的应用程序所建立的所有对象。垃圾回收是一种动态存储管理技术。它按照特定的垃圾回收算法,自动释放掉不再被引用的对象。堆内存里垃圾的回收靠的是垃圾收集器。JVM规范并不需要特殊的垃圾回收技术,但是由于内存有限,JVM在实现的时候,都有一个被垃圾收集器管理的堆。
引用
内存记录碎片
在堆内存中,被引用的对象处于存活状态,一旦堆内存中的对象不再被引用,那这些对象就成了垃圾。垃圾收集器就会查找并释放掉这些对象所占用的内存空间。除了释放内存空间以外,垃圾收集器还会清楚内存记录碎片。这些碎片是在创建对象和释放对象所占用的空间的时候所产生的。垃圾处理器在处理碎片的时候会将碎片所占用的内存空间移动到堆内存的一端来分配给新的对象。
垃圾回收机制的优点:
1.提高编程效率。
垃圾回收机制会节省很多时间,不必花时间去解决存储器问题。
2.避免内存泄露
垃圾回收机制的缺点:
1.垃圾收集器的开销影响程序性能
JVM必须追踪运行程序中的所有对象,并且释放掉垃圾所占的内存。这个过程会耗时
2.垃圾收集器算法不完备,不能保证收集到所有垃圾
垃圾收集器判断一个对象空间是否是垃圾的标准:
对象不再被引用或者没有被引用就视为垃圾
垃圾收集的过程是自动进行的,也可以使用System.gc()方法提醒JVM检查有没有要回收的对象。它不会明确指定让JVM去回收哪个对象。垃圾收集是JVM上收线机最低的线程,调用这个方法一般也不会马上进行垃圾收集。
项目中能手动释放的资源就手动释放。一般close()方法的底层实现就是手动释放。
良好的编程习惯是,用完一个对象后,把这个对象的引用设为null值。
Java垃圾回收机制的工作特点:
1.垃圾收集线程是低优先级的,但是如果内存占用太多,那垃圾收集线程可能会突发执行来释放内存。垃圾收集不可以被强制执行,程序员可以通过System.gc()建议垃圾收集器执行
2.不能保证垃圾一定会被收集
3.可以将引用变量设为null值,来通知垃圾收集器收集。但是如果这个对象设有事件监听器,那他还是不能被收集,所以在将引用变量设为空之前要把监听去掉。
4.每个对象都有一个finalize()方法,这个方法是从Object类继承的。这个方法用来回收内存以外的系统资源,编程时这个方法的顺序和方法执行的顺序不相干。
Java允许程序眼为任何一个对象添加这个方法,这个方法会在垃圾收集器收集这个对象之前被调用。但不要过分依赖这个方法对系统资源的回收,因为这个方法调用后的执行结果不可预知。
5.当一个方法执行完毕,其中的局部变量就是消失,被垃圾收集器收集,以后如果再来调用这个方法,局部变量会重新创建。
Java垃圾收集机制:
1.垃圾回收的时间随机
2.Java提供了一些用于垃圾收集的类,而且提供了建议垃圾回收的方法,但仅仅是建议
3.垃圾收集器有多种,使用不同的算法实现
4.通过把引用变量设为null值,尽早释放无用对象。