• 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

  • 相关阅读:
    0593. Valid Square (M)
    0832. Flipping an Image (E)
    1026. Maximum Difference Between Node and Ancestor (M)
    0563. Binary Tree Tilt (E)
    0445. Add Two Numbers II (M)
    1283. Find the Smallest Divisor Given a Threshold (M)
    C Primer Plus note9
    C Primer Plus note8
    C Primer Plus note7
    C Primer Plus note6
  • 原文地址:https://www.cnblogs.com/exceptionblog/p/10984443.html
Copyright © 2020-2023  润新知