JVM
jvm 是java jre包中 可以解析字节码 转成机器码 使得跨平台

jvm内存布局
jvm 分成 栈,堆,方法区,程序计数器,本地方法栈,连接执行引擎,native方法接口,native方法
线程共享
堆:存放对象实例 分为 新生代 适合复制算法(1:1:8分配),老年代 gc回收
方法区(元空间):存放类字节码 类结构信息
程序计数器:记录 字节码指令地址
栈:存放局部变量,过程方法
本地方法栈:可以支持其他语言

引擎: 半解释(解释器) 半编译 JTC

类加载执行流程
类加载流程: 加载-连接(验证-准备-解析)-初始化-使用-卸载
加载:通过class文件转成二进制字节流,将这个静态存储结构转化为方法区的运行时数据结构,在方法区生成 对象
验证:文件格式验证 元数据验证 字节码验证 符号引用验证
准备:堆类的变量分配内存 没有初始化
初始化:执行类构造器 进行赋值
使用:执行main方法
结束:销毁class对象

双亲委派机制
三种加载器 从下往上
app 应用程序加载 -> etc 拓展加载 -> boot Lib 加载
加载直接找父类,父类没有,依次往下找 解决类冲突

垃圾回收算法
垃圾:长时间没被使用
引用计数法:使用+1 不使用-1 无法解决 循环问题
gcRoot: 可触达 能够被摸到 就不是垃圾
垃圾算法:
1 复制算法:内存分半,空间浪费,效率高
2 标记清除法:通过gc标记 去除垃圾 无序 效率低
3 标记整理法:通过gc标记 先整理 可用 再去除垃圾
垃圾回收思想:分代 新生区(1:1:8)复制算法 老年区
分区:可控制分区大小

垃圾回收器
串行 回收器:Serial(复制算法) , Serial old(标记清除算法) 单线程 最老的
并行 回收器: ParNew(复制算法),Parallel Scavenge(复制算法 注重吞吐量),Parallel old(标记整理算法) 多线程
CMS 回收器: 标记清除算法 关注停顿时间 多线程
G1 回收器: jdk1.7之后 分代 分区算法 内存分割

jvm调优
防止 oom Full stw
步骤:性能监控(cpu过高)-性能分析-性能调优
使用jps,jstat指令 可以查看java里面运行的进程
jps -v jvm参数
jps -l 全类名
jstat -class 进程id 查看类信息
jstat -gc 进程id 查看gc详细信息 0区 1区 e区 堆内存
jstack 进程名 查看死锁

评论