java核心技术第四章疑问点

1、java中的finalize()方法

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

那么就会出现一个疑问。java中本身就存在垃圾回收机制。那为什么还需要finalize()方法呢。原因在于。java的垃圾回收机制只针对堆中的垃圾对象进行回收。也就是说,jvm只负责我们new出来的内存堆块。而对于那些不是new出来的,而是通过jni方法去调用非java实现的方法(一般为c/c++)而调用的非堆内存时。jvm无法去做垃圾回收的处理。因此这部分内存消耗就没法进行回收。因此java引入了finalize()方法。

因此我们现在就能够很明显的知道。finalize()方法是为了处理jvm管理不到的内存消耗而诞生的。一般用于释放特殊内存(jvm无法处理的内存)。因此,如果某个类中定义了native方法。产生了一些非堆的内存消耗。此时才考虑finalize()方法去释放非堆内存。

finalize() 与 析构函数的不同

  -Java因为有GC机制,所以没有析构函数的概念!

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

gc回收机制

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

2、类路径

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

猜你喜欢

转载自www.cnblogs.com/exceptionblog/p/10984443.html