JVM个人学习笔记
JVM 三大系统
1、类加载子系统
硬盘上编译完成的class文件 需要类加载子系统 加载到 内存中
2、执行引擎
执行引擎通过内存中的数据 返回结果
3、JVM运行时数据区(栈和堆组成) 堆 线程共享区域 栈 线程私有区域
堆 : 新生代 老年代
新生代: Eden 伊甸园 绝大多数对象默认会存储在 新生代伊甸园区域
eden 伊甸园区 对象满的时候 会去触发 minorGc 进行可达性分析gc roots 判断对象是否处于游离状态(第一次触发 如果该区域对象还在被使用 就会把这个对象 放在 from 区 并对分代年龄age+1)
from 如果from内存区 也满了 就触发minorGc 判断对象状态 如果存在对象还在使用 就将对象拷贝到 to区 to区 就变成的from区
to
老年代:如果from中的对象分代年龄 已经到15了 还没被扔出去 就会进入老年代 如果老年代 没有内存空间可分配的话 会触发fullGC 出现STW (stop world) 老年代满了 会出现 outofmemory 内存溢出异常
方法区:用来存储类信息(堆中对象指向类信息)会存在一对多的关系
虚拟机栈
栈 就是数据结构 特点是先进后出 后进先出 first in last out
虚拟机栈栈帧数据结构:局部变量 、操作数栈、方法出口
操作数栈: 汇编指令 将 常量压入 栈 就是进入的操作数栈
局部变量:32位的存储类型, 会存入基础类型 和引用类型的局部变量对象 利用程序计数器去记录对应指令变量位置 完成赋值
程序计数器
本地方法栈
用来存储 由关键字native修饰的方法
问题 java 性能调优的目的: 在有限的物理内存上做更多并且不会导致影响机器性能的事情
为什么java 需要采用分代回收的策略: 减少stw的次数 减少fullGc的次数 提高程序的吞吐量 jvm调优的目的