JVM 2020-11-30
2020-11-30 本文已影响0人
_一叶孤帆
每个线程独享的区域:
程序计数器、虚拟机栈、本地方法栈
程序计数器:
当进行 CPU 调度的时候,用来记录当前线程的执行进度。
虚拟机栈:
默认大小为 1M (参数名为 -Xss)
- 栈帧:
栈帧包括:
局部变量表 存储基本八大类型 + 引用
操作数栈 存储方法执行
动态连结 多态:静态分派、动态分派
完成出口
Java 的解释执行是基于栈(操作数栈),兼容性好,效率偏低(相比硬件)
C 是基于寄存器(硬件)运算,移植性差,
本地方法栈
保存的是 native 方法的信息。
[图片上传失败...(image-645730-1606721015410)]
带有 native 标记的方法,利用 C 语言实现的。
当一个JVM 创建的线程调用 native 方法后,JVM 不再为其在虚拟机栈中创建栈帧,只是简单的动态链接并直接调用 native 方法。
程序共享的区域
为什么需要两部分(堆和方法区)?
堆中的东西都需要频繁的回收
方法区的内容是不需要频繁的回收
方法区
类信息
常量
静态变量
即时编译器编译后的代码
<= 1.7 永久代
= 1.8 元空间 方便拓展 挤压堆空间
堆
对象
数组
java 堆内存参数配置
-xmx 堆内存分配最大上限
-xms 堆内存初始内存大小
直接内存 (堆外内存)
方法区的内容是回收的还是较少回收的?
堆外内存 NIO ?
内存溢出
- 栈溢出
- 堆溢出
- 方法区溢出
- 直接内存溢出
虚拟机优化
方法内联
栈帧之间数据共享
类的卸载
- 类所有实例全被回收
- 加载该类的 classload 已经被回收
- 该类 java.lang.class 对象 没有任何地方被引用。无法通过反射去访问该类的方法。
满足以上可被回收。
可配参数 -Xnoclassgc,开启此参数,就不会被回收。