###Jvm最新面试题,常见面试题及答案汇总知识点详细解读
#### 类加载机制
在Java虚拟机(JVM)中,类加载过程主要分为五个阶段:加载、验证、准备、解析和初始化。加载阶段是JVM找到并加载class文件的字节码数据;验证阶段确保加载的类信息符合JVM规范,没有安全问题;准备阶段为类变量分配内存,并设置类变量的默认初始值;解析阶段是JVM将常量池内的符号引用替换成直接引用;初始化阶段则是执行类构造器`<clinit>()`方法的过程。
#### Java对象结构
Java对象由三个部分组成:对象头、实例数据和对齐填充。对象头包含运行时数据,如哈希码、GC分代年龄和锁状态等,以及指向类元数据的指针。对于数组对象,对象头还包含数组长度信息。实例数据存储对象的实际信息,包括父类继承和自己定义的信息。对齐填充是为了保证对象的总长度是8字节的整数倍,使得内存地址对齐。
#### 垃圾回收器查看
查看服务器上默认的垃圾回收器,可以通过运行Java程序时添加`-XX:+PrintCommandLineFlags`参数,这个参数可以打印出包括垃圾回收器在内的所有参数信息。
#### Java强引用
在Java中,强引用是对象引用的一种,对象只要被强引用关联,就不会被垃圾回收机制回收,即使该对象不再被使用。强引用是Java内存泄漏的主要原因之一,因为它会阻止垃圾回收器回收无用对象。
#### Jvm内存模型
JVM内存模型根据规范分为五个部分:虚拟机栈、堆、方法区、程序计数器和本地方法栈。其中,堆是存储对象实例的地方。方法区用于存储已被虚拟机加载的类信息、常量、静态变量等。程序计数器负责记录线程执行的字节码指令地址。从JDK 1.7开始,永久代(PermGen)被元空间(Metaspace)所替代。元空间使用的是本地内存,与永久代的区别在于它不在虚拟机中,而是直接使用操作系统的本地内存,从而避免了内存溢出和GC的复杂度。
#### JVM堆内存大小
对于32位JVM而言,理论上最大堆内存可以达到4GB,但实际上由于操作系统的限制,实际可用堆内存通常会小于这个数值,例如Windows系统大约为1.5GB,Solaris约为3GB。64位JVM理论上最大堆内存可以达到2^64,但实际上由于系统和JVM实现的限制,通常设置的堆内存大小远小于这个理论值。例如,一些JVM允许指定堆内存大小到100GB,而像Azul这样的JVM甚至可能支持1000GB的堆内存大小。
#### HashMap中的key
在Java中,HashMap的key可以是任意对象,但需要注意的是,作为key的对象需要正确地覆写equals()和hashCode()方法。因为HashMap在判断两个key是否相等时,会调用对象的equals()方法,并且当两个key的hashCode()返回值相等时,还会进一步使用equals()方法来比较。因此,如果key对象的equals()方法和hashCode()方法没有合理地覆写,可能会导致key的比较行为不符合预期,进而影响HashMap的正确性。