目录
- 一、finalize
- 二、引用计数
- 三、JVM停止复制
- 四、JVM即时编译器
- 五、惰性评估
大家好,我是哪吒。
🏆本文收录于,49天精通Java从入门到就业。
全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。
一、finalize
在Java中,finalize()是一个Object类的方法,用于在对象被垃圾收集器回收之前执行一些清理操作。当一个对象成为垃圾时,它的finalize()方法会被自动调用。
finalize()方法的语法格式如下:
protected void finalize() throws Throwable {
// 清理代码
}
在finalize()方法中可以编写一些清理资源的代码,例如关闭文件、释放内存等。
finalize() 方法只能在对象被垃圾回收之前调用,并且不能抛出异常。如果在垃圾回收之前调用 finalize() 方法,将会导致程序崩溃。因此,在编写 finalize() 方法时,需要考虑对象的生命周期和清理操作的执行顺序。
垃圾回收器的目的是回收程序里不再使用的内存。所以任何与垃圾回收相关的活动,特别是finalize()方法,都与内存的释放息息相关。
通常情况下,我们不能依赖finalize(),而是必须创建爱你单独的清理方法,并显式的调用它们,finalize()只对一些非常罕见的特殊长江的内存清理有用。
需要注意的是,finalize()方法的执行时机是不确定的,并且不能保证一定会被执行。
因此,不应该在finalize()方法中依赖于某些必要的操作,如果有必要进行清理操作,应该使用finally块来确保清理操作一定会被执行。
另外,由于finalize()方法的执行时机和顺序是不确定的,因此通常不建议在程序中过多地依赖它。如果需要在程序运行期间进行清理操作,应该显式地调用相应的清理方法,而不是依赖于finalize()方法。
二、引用计数
每个对象都包含一个引用计数器,并且每次该对象被引用时,引用计数都会增加。每次引用离开作用域或设置为null时,引用计数都会减少。管理引用计数是在程序整个生命周期中都存在的一个小而恒定的开销。垃圾收集器遍历整个对象列表,当它找到引用计数为零的对象时,就会释放该存储空间。
引用计数有一个问题,就是如果对象循环引用彼此,就算变成了垃圾,它们的引用计数可能仍不是零。定位这种自引用的对象组需要垃圾收集器做大量额外工作。
JVM 引用计数的目的是为了避免内存泄漏和死锁等问题。
JVM 引用计数的值是在运行时动态计算的,因此它们可能会随着时间的推移而发生变化。此外,JVM 引用计数的值也可能会被垃圾收集器重新分配,因此它们的值可能会发生变化。
总之,JVM 引用计数是一种用于管理内存的机制,它可以帮助JVM 避免内存泄漏和死锁等问题。
三、JVM停止复制
JVM停止-复制算法是一种用于垃圾回收的算法,在JVM中被称为标记-清除-复制算法。
该算法分为两个阶段:标记和清除。
在标记阶段,垃圾回收器遍历所有的引用对象,标记出所有“可达”的对象,即可以被程序访问到并使用的对象。在清除阶段,垃圾回收器会将未被标记的“不可达”对象清除掉,并将所有“可达”对象移动到一个新的内存区域中,以便进行下一次垃圾回收。
在移动可达对象时,JVM采用了一种称为复制(Copy)的方式。具体来说,它将堆内存划分为两个大小相等的空间,分别为From Space和To Space。在每次垃圾回收时,JVM会将所有“可达”对象从From Space复制到To Space中,并按照顺序依次排列。然后,将From Space中的所有对象全部清除掉,使其变为空闲内存区域。这样就完成了一轮垃圾回收。
停止-复制算法相对于标记-清除算法来说,它可以有效避免内存碎片问题,并且在清理垃圾时效率更高。但是,它也存在一些缺点,例如需要额外的空间来存储To Space,同时在移动对象时也会增加一定的开销。
四、JVM即时编译器
JVM即时编译器是一种Java虚拟机的编译器,它可以在运行时将Java源代码编译成字节码,从而加速Java应用程序的开发和部署。JVM即时编译器可以提高Java应用程序的性能和响应速度,因为它可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
JVM即时编译器通常由Java虚拟机提供商提供,并且需要在运行Java应用程序的计算机上安装相应的JVM。JVM即时编译器可以将Java源代码编译成字节码,并将其存储在本地内存中,从而加速Java应用程序的开发和部署。
JVM即时编译器的主要优点包括:
- 提高Java应用程序的性能和响应速度:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
- 提高Java应用程序的可维护性和可扩展性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
- 提高Java应用程序的安全性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
- 提高Java应用程序的可移植性:JVM即时编译器可以将Java代码编译成本地代码,从而避免了在Java虚拟机中运行Java字节码所需的时间和开销。
总之,JVM即时编译器是一种非常有用的Java编程工具,它可以提高Java应用程序的性能和响应速度,并提高Java应用程序的可维护性和可扩展性。
五、惰性评估
惰性评估的意思是除非必要,否则不会对代码进行即时编译。
永远不执行的代码可能永远不会被即时编译。
惰性评估通常用于优化代码的执行时间和空间复杂度。它在执行之前包含大量表达式,但不会立即评估它们。相反,它只在需要结果时才评估它们。这种方法有助于减少算法的时间复杂度,因为它不需要重复计算,并且可以避免算法在执行之前包含大量表达式。
🏆本文收录于,49天精通Java从入门到就业。
全网最细Java零基础手把手入门教程,系列课程包括:基础篇、集合篇、Java8新特性、多线程、代码实战,持续更新中(每周1-2篇),适合零基础和进阶提升的同学。
🏆哪吒多年工作总结:Java学习路线总结,搬砖工逆袭Java架构师。