JVM内存结构
JVM内存结构
-
线程私有的区域
-
JVM方法栈
每个方法被调用到执行完成的过程,就对应着栈帧在JVM中入栈到出栈的过程
-
本地方法栈
与JVM方法栈类是,只不过本地方法栈用来执行Native方法,为Navive方法服务
-
程序计数器
相当于指示器,告诉程序该执行哪条命令了
-
-
线程共享的区域
-
堆(调优主要就是调这块区域)
堆主要是存储对象的实例,所以它占用的内存是最大的
-
堆逻辑上又分为新生代,老年代,元空间
-
物理上其实元空间在本地内存中
-
新生代
- Eden(伊甸园)
- From Survivor(幸存者1区)
- To Survivor(幸存者2区)
Minor GC
可以把对象比作士兵,刚入伍的新兵蛋子在Eden区域,每战斗一次,就会牺牲一批士兵,相当于是GC一次,(新生代是Minor GC ),幸存下来的士兵会进入幸存者2区,等下次战斗的时候幸存下来的士兵会和刚来的又一批的新兵蛋子一起战斗,还是活下来的进入幸存者2区,(每Minor GC一次,幸存者1区和2区会互换一次,幸存者1区就会变成幸存者2区,相同,幸存者2区也会变成幸存者1区,这是因为新生代的GC垃圾回收算法是复制算法)
进入老年代
进入老年代需要满足这两个条件中的一个
- 经历过15次GC,战斗过15次,可以荣升为将军,次数可以通过参数调整
- 幸存者2区满了
Full GC
当老年代也满了,就会触发Full GC。Full GC比Minor GC花费的时间要长,Full GC采用的是标记清除和标记整理算法
-
-
方法区
用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
-
OutOfMemoryError
- Exception in thread “main”: java.lang.OutOfMemoryError: Java heap space
- 原因对象不能被分配到堆内存中,堆内存益处
- OutOfMemoryError: Metaspace
- 元空间内存溢出
注:这是学习笔记 通过学习 纯洁的微笑 JVM相关文章以及网上相关文章做的笔记,有不对的地方还望多多指教。