用过JDK9的同学应该发现了,finalize方法在JDK9中已经被标记为deprecated,今天探讨一下finalize方法。如果没有特别的原因,不要实现finalize方法,也不要指望利用它来进行资源回收。因为你无法保证finalize什么时候执行,执行的是否符合预期。使用不当会影响性能,导致程序死锁、挂起等。
目前的垃圾收集器主要有7种,上图是他们的使用关系,连在一起的就可以配合使用。JDK11出现两种新的垃圾收集器,一个是Epsilon垃圾收集器,一个是ZGC垃圾收集器。垃圾收集器中很重要的两个概念:Stop-The-World和Safepoint。首先说说Stop-The-World:JVM由于要执行GC而停止了应用程序的执行,任何一种GC算法中都会发生。多数GC优化通过减少Stop-the -world发生的时间来提高程序性能。安全点 Safepoint:分析过程中对象引用关系不会发生变化的点,产生Safepoint的地方:方法调用、循环跳转、异常跳转等,安全点数量得适中。
本篇文章主要讲述了Java内存模型中的程序计数器、虚拟机栈、本地方法栈、元空间与堆,以及堆中的常量池。前面通过javap反编译class文件得到int add(int a, int b)
函数的栈帧,主要分析了栈帧中JVM指令对应的局部变量表、操作数栈、程序计数器的状态变化。以及JDK7以后出现了替代永久代的元数据区,并分析了元数据区替换了永久代有哪些好处,主要分析了给字符串常量池带来的影响,并通过代码验证了元数据区相比永久代的优越性。学习了JVM性能调优的三个参数的意义和普通用法,最后探讨了并验证了JDK1.6与JDK1.7+的版本String类的intern方法的不同表现结果,分析了出现不同结果的原因,其实主要是JDK1.6的版本是建立副本再放入字符串常量池,而JDK1.7+版本时直接把堆上的对象的引用入池。