JVM初认识

1、jvm 内存模型

程序计数器 Program Counter Register:

  • 记录的是正在执行的虚拟机字节码指令的地址。
  • 此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区域

虚拟机:VM Stack

  • 描述的是 JAVA 方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧, 用于存储局部变量表,操作数栈,动态链接,方法接口等信息
  • 局部变量表存储了编译期可知的各种基本数据类型、对象引用
  • 线程请求的栈深度不够会报 StackOverflowError 异常
  • 栈动态扩展的容量不够会报 OutOfMemoryError 异常
  • 虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈

本地方法:Native Stack

  • 本地方法栈类似于虚拟机栈,只不过本地方法栈使用的是本地方法

堆:Heap

  • 几乎所有的对象实例都在堆上分配内存

2、堆

所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也被称为“GC 堆”;也是我们优化最多考虑的地方。 堆可以细分为:

1.新生代

  • Eden 空间
  • From Survivor 空间
  • To Survivor 空间

2.老年代

3.永久代/元空间

  • Java8 以前永久代,受 jvm 管理,java8 以后元空间,直接使用物理内存。因此, 默认情况下,元空间的大小仅受本地内存限制。 垃圾回收

从 Java8 开始,HotSpot 已经完全将永久代(Permanent Generation)移除,取而代之的是一 个新的区域—元空间(MetaSpace)

3、运行图

由于FGC的速度比YGC的速度慢得多,所以JVM的优化也是尽量避免FGC

# JVMGC

评论

1 条

@哆啦A梦

留下印记

回复 ·

添加新评论