1、JVM构成
image.pngJava栈是线程私有的,每个线程创建的同时都会创建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信息
分代收集算法
年轻代
- 存活率低
- 复制算法
老年代 - 存活率高
- 标记清除 + 标记压缩 混合实现
网友评论