java核心技术第四章疑问点

一、java中的finalize()方法html

Java中假定finalize的工做原理为:一旦垃圾回收器准备回收内存而释放对象所占内存的时候,会先调用该对象的finalize方法,而后在下一次再须要垃圾回收的时候才真正的回收对象。finalize()的做用:finalize用于在GC发生前事先调用去回收JNI调用中申请的特殊内存,下次GC发生时候保证GC后全部该对象的内存都释放了。java

那么就会出现一个疑问。java中自己就存在垃圾回收机制。那为何还须要finalize()方法呢。缘由在于。java的垃圾回收机制只针对堆中的垃圾对象进行回收。也就是说,jvm只负责咱们new出来的内存堆块。而对于那些不是new出来的,而是经过jni方法去调用非java实现的方法(通常为c/c++)而调用的非堆内存时。jvm没法去作垃圾回收的处理。所以这部份内存消耗就无法进行回收。所以java引入了finalize()方法。c++

所以咱们如今就可以很明显的知道。finalize()方法是为了处理jvm管理不到的内存消耗而诞生的。通常用于释放特殊内存(jvm没法处理的内存)。所以,若是某个类中定义了native方法。产生了一些非堆的内存消耗。此时才考虑finalize()方法去释放非堆内存。jvm

 

finalize() 与 析构函数的不一样函数

  -Java由于有GC机制,因此没有析构函数的概念!htm

  -finalize不是C++中的析构函数:析构函数确定是会销毁该对象的,可是finalize由于gc机制不会常常发生,因此其被执行的是不肯定的。若是gc不发生,那么finalize()方法就不会调用。就算gc发生了,若是该类不是垃圾对象,那么finalize()方法也不会调用。对象

gc回收机制blog

  -Java的垃圾回收器只会释放由咱们new出来的内存堆块,那些不是由new出来的“特殊内存”,垃圾回收器是不会管理的。
  -所谓的特殊内存指经过JNI用C/C++向系统申请的内存,这些内存若是不手动去清除就会一直占据在内存中。
  -并且,垃圾回收自己就有开销,因此虚拟机不会常常GC,只有当内存快要耗尽的时候JVM才会触发GC。

二、类路径内存

https://www.cnblogs.com/hejing-swust/p/8514251.htmlget

相关文章
相关标签/搜索