JVM探究
jvm的位置: 硬件体系---------操作系统之上---------jvm
java---classfile------类加载器-----------(运行数据区)------方法区 Java栈 本地方法栈 堆 程序计数器
-- 本地方法接口 本地库-------执行引擎

JVM99 就是调堆 方法区是特殊的堆
类加载器 :加载class文件
双亲委派机制 :安全 APP---EXC----BOOT 直到根 rt.jar

class not found~~~ null:java 调用不到 因为C写的
CC++--=java 指针 内存管理
沙箱安全机制: 沙箱---- 签名--域(root)--
数字签名--证书
native 说明 Java的范围达不到了 回去调用底层C语言 本地接口 会进入本地接口
加载本地方法加载JNI PC寄存器 私有的
方法区: 静态变量 常量 class final static 常量池
栈:数据结构 先进后出
队列:先进先出 (FIFO) 栈内存 主管程序的运行,生命周期和线程同步
线程结束,栈就over
栈: 8大基本类型 +引用对象+ 实例的方法
程序正在执行的方法 在栈顶 StackOverflower
三种JVM :sun hotstop BEA jockit IBM J9
堆 heap 一个jvm只有一个堆内存
类加载器读取文件后,放什么东西到堆里 ::;;保存引用类型的真实对象
三个区域:新生区(新生区 幸存区0区 幸存1区 ) 老年代 持久区
gc垃圾回收主要 伊甸园区和老年区 永久存储区 ---------元空间
新生区: 诞生 成长 甚至死亡 所有对象都是伊甸园区 new出来
经过研究99% 对象都是临时对象 oom错
永久区: 1.6 常量在方法区 1.7 常量池在堆 常量池在元空间 无永久代
存储java运行化境和类信息 关闭虚拟机就可以释放内存

默认情况下 总内存电脑的1/4 初始化内存 1/64
MAT JPOfiiler
分析dump文件 快速定位内存问题
GC : 新生代 幸存区 老年区
GC两种类: 轻GC 重GC
GC的算法 标记清除 标记整理 复制算法 引用计数法
好:复制没有碎片 坏: 浪费空间
适用:对象存活较低
标记清除: 扫描对象 进行标记 对没有标记的清除
两次扫描 浪费时间 产生内存碎片
标记压缩: 防止内存碎片产生 多了一个移动的过程
内存效率: 复制------标记清除-------标记压缩(时间复杂度)
内存整齐度:复制=标记压缩》标记清除
内存利用率:标记压缩=标记清除》复制算法
没有最好的算法 只有最合适的算法
所以分代: 年轻代 复制算法 存活率低
老年代 标记清除+标记压缩混合

浙公网安备 33010602011771号