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 ?

内存溢出

虚拟机优化

方法内联

栈帧之间数据共享

类的卸载

  1. 类所有实例全被回收
  2. 加载该类的 classload 已经被回收
  3. 该类 java.lang.class 对象 没有任何地方被引用。无法通过反射去访问该类的方法。

满足以上可被回收。

可配参数 -Xnoclassgc,开启此参数,就不会被回收。

上一篇下一篇

猜你喜欢

热点阅读