JVM面试专题

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1. 内存模型以及分区需要详细到每个区放什么。

JVM 分为堆区和栈区还有方法区初始化的对象放在堆里面引用放在栈里面

class 类信息常量池static 常量和 static 变量等放在方法区

new:

方法区主要是存储类信息常量池static 常量和 static 变量编译后的代码字

节码等数据

堆初始化的对象成员变量 那种非 static 的变量所有的对象实例和数组都要

在堆上分配

栈栈的结构是栈帧组成的调用一个方法就压入一帧帧上面存储局部变量表操

作数栈方法出口等信息局部变量表存放的是 8 大基础类型加上一个应用类型所

以还是一个指向地址的指针

本地方法栈主要为 Native 方法服务

程序计数器记录当前线程执行的行号

2. 堆里面的分区Edensurvival from+ to老年代各自的特点。

堆里面分为新生代和老生代java8 取消了永久代采用了 Metaspace新生代包

含 Eden+Survivor 区survivor 区里面分为 from 和 to 区内存回收时如果用的是复

制算法从 from 复制到 to当经过一次或者多次 GC 之后存活下来的对象会被移动

到老年区当 JVM 内存不够用的时候会触发 Full GC清理 JVM 老年区

当新生区满了之后会触发 YGC,先把存活的对象放到其中一个 Survice

区然后进行垃圾清理。因为如果仅仅清理需要删除的对象这样会导致内存碎

片因此一般会把 Eden 进行完全的清理然后整理内存。那么下次 GC 的时候

就会使用下一个 Survive这样循环使用。如果有特别大的对象新生代放不下

就会使用老年代的担保直接放到老年代里面。因为 JVM 认为一般大对象的存

活时间一般比较久远。

3. 对象创建方法对象的内存分配对象的访问定位。

new 一个对象

4. GC 的两种判定方法

引用计数法指的是如果某个地方引用了这个对象就+1如果失效了就-1当为 0 就

会回收但是 JVM 没有用这种方式因为无法判定相互循环引用A 引用 B,B 引用 A

的情况

引用链法 通过一种 GC ROOT 的对象方法区中静态变量引用的对象等-static 变

量来判断如果有一条链能够到达 GC ROOT 就说明不能到达 GC ROOT 就说明

可以回收

5. SafePoint 是什么

比如 GC 的时候必须要等到 Java 线程都进入到 safepoint 的时候 VMThread 才能开始

执行 GC

1. 循环的末尾 (防止大循环的时候一直不进入 safepoint而其他线程在等待它进入

safepoint)

2. 方法返回前

3. 调用方法的 call 之后

4. 抛出异常的位置

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6