JVM面试杂知识

JVM面试杂知识 String s new String“abc”执行过程中分别对应哪些内存区域1. 元空间 (Metaspace)在代码执行前JVM 需要加载String类和包含这行代码的类。动作类加载器将类的结构信息方法、字段定义、运行时常量池存入元空间。存储内容String类的模板信息以及字节码指令。2. 堆字符串常量池 (String Constant Pool)执行到abc这个字面量时动作JVM 会先检查字符串常量池中是否存在内容为abc的对象。存储内容如果池中没有则在堆的字符串常量池区域创建一个abc对象实例。如果已经存在则直接复用。3. 堆普通对象区域 (Java Heap)执行到new String(...)时动作无论常量池中是否已有abcnew关键字都会强制在堆的普通对象区域非池化区域开辟一块新内存。存储内容创建一个全新的String对象实例。这个对象的内部value属性会指向刚才常量池中abc对象的底层数组。4. 虚拟机栈 (JVM Stack)执行到String s和赋值操作时动作在当前线程方法的栈帧中为局部变量s分配空间。存储内容将堆中新创建的String实例的内存地址存入局部变量表的s变量中。5. 程序计数器 (Program Counter)在整个执行过程中动作程序计数器不断更新指向ldc从常量池加载、new分配内存、invokespecial调用构造函数、astore存入局部变量等字节码指令的偏移量。方法区/元空间 中方法执行过程1.找到元空间中该方法的定义2.根据定义在虚拟机栈中创建栈帧3.程序计数器中创建对应计数器4.线程执行5.执行完退出清理该方法栈帧恢复计数器为调用前位置