JVM面试详解

2020-10-31  本文已影响0人  Binary_r

1、JVM构成

image.png

Java栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址。

PC寄存器
PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息。

本地方法堆栈(Native Method Stacks)
JVM采用本地方法堆栈来支持native方法的执行,此区域用于存储每个native方法调用的状态。

方法区域(Method Area)
(1)在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代。
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。

堆(Heap)
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收

不可能存在垃圾回收的地方

Java栈、本地方法栈、程序计数器

原因:如果存在垃圾就会一直阻塞,栈用完就会弹出去

JVM调优指的是调优那一部分

答案:堆、方法区(方法区也是一个特殊的堆)

2、双亲委派机制

(1)、APP -> EXC -> BOOT

1、类加载器收到类加载的请求
2、将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3、启动加载器检查是否能够加载当前这个类,能加载就结束,使用当前的加载器,否者抛出异常,通知子加载器进行加载
4、重复步骤3

3、堆内存空间

image.png
常量池在方法区中
持久代/元空间也是存在堆中,别名"非堆"
OOM堆内存满了

-Xms1024 -Xmx1024 -XX:+PrintGCDatails启动时显示JVM信息

分代收集算法

年轻代

上一篇 下一篇

猜你喜欢

热点阅读