内存巨细:在jdk1.8之前,永久代是放在堆内存中的,也就是说在JVM内存中,但是随着项目的复杂度、框架使用、三方库的使用,永久代中需要存储的类越来越多,导致固定内存巨细的永久代无法实用,所以这里把永久代转换成元空间,并把它放到本地内存中,不占用jvm内存空间。
垃圾回收:永久代的垃圾回收相对复杂。因为它里面存储的类信息等数据的生命周期和普通对象差别,垃圾回收器很难准确判断哪些类信息是可以回收的。例如,一个类加载后,纵然没有任何实例对象存在了,只要这个类还在被其他类引用(比如通过反射),它在永久代中的信息就不能被回收。这种复杂的回收机制导致永久代的内存清理效率较低。
性能题目:永久代中的类数据和字符串常量池等内容混在一起,当举行垃圾回收大概内存整理时,会对整个永久代举行操作。永久代的垃圾回收会触发 Full GC,这好坏常耗时的过程,在高负载系统中影响较大。而元空间独立于堆内存,大大淘汰了永久代干系的 Full GC 次数,因此在运行时淘汰了长时间的中断。 方法区和其他内存结构的关系?
程序计数器是JVM内存模型中的一个紧张部分,它是线程私有的,也就是说每个线程都会按照本身的程序计数器指向指令去按顺序执行。 程序计数器的紧张职责是告诉JVM接下来应该执行哪条字节码指令。
在类加载阶段,程序计数器尚未发挥作用。而当程序启动时,主线程的程序计数器会初始化为指向 Main 方法字节码指令的首条。随后,随着字节码指令的渐渐执行,它持续更新,每执行完一条指令,便精准指向下一条指令地址,以此确保方法中的字节码指令依序执行。若遭遇 if - else 分支语句,程序计数器会依据判断结果跳转至相应的字节码指令地址;当遇到方法调用时,它会先留存当前方法当前字节码指令的地址,而后跳转至被调用方法内继续执行,待被调用方法执行完毕,再重新回到之前留存的位置,从而保障程序执行流程的连贯性与准确性。
堆区