jvm面试题(一)

参考《深入理解JVM》这本书,总结一下面试中常备问到的问题

1.java内存结构?

jvm中内存大体分为两部分,一部分是线程共享的包括:方法区和堆,一部分是线程隔离的(私有的)包括虚拟机栈和程序计数器,有的vm中还包括一个本地方法栈用来在调用native方法时存储相关信息,jdk自带的Hotspot虚拟机没有这部分。

程序计数器可以理解为当前线程所执行的自己的行号指示器,经常用来线程切换之后用来恢复之前线程时确定位置。

java虚拟机栈用来描述java方法执行时的内存模型,其中存储着栈帧,每个方法在执行时都会创建一个栈帧,其中存储着局部变量表、操作数栈、动态链接、方法接口等信息。

局部变量表中存储着编译期可知的各种基本数据类型、对象引用和returnAddress类型(指向了一条字节码指令的执行地址)

局部变量表的大小编译期可知,运行时不会改变他的大小。

java堆是被所有线程共享的一块区域,用来存储对象实例和数组(不绝对,根据逃逸分析技术,也有可能会在编译期时进行优化,把对象拆分后存储在栈中,后文再详说)。java堆大致可以分为新生代和老年代,java对是gc主要目标

方法区(Methad Area)也是线程共享的区域,用来存储jvm加载的类信息、常量、静态变量、即时编译后的代码等数据。方法区中包含一个运行时常量池:里边有编译期生成的常量表。

2.java对象创建过程

1.jvm遇到一条新建对象的指令时首先去检查这个指令的参数是否能在常量池中定义到一个类的符号引用。然后加载这个类(类加载过程在后边讲)

2.为对象分配内存。一种办法“指针碰撞”、一种办法“空闲列表”,最终常用的办法“本地线程缓冲分配(TLAB)”

3.将除对象头外的对象内存空间初始化为0

4.对对象头进行必要设置

3.java对象结构

java对象由三个部分组成:对象头、实例数据、对齐填充。

对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

对齐填充:jvm要求对象起始地址必须是8字节的整数倍(8字节对齐)

4.java对象的定位方式

句柄池、直接指针。


猜你喜欢

转载自blog.csdn.net/TRUE_LOVE1314/article/details/52260949