JVM个人学习笔记

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调优的目的