jvm
jvm的理解 虚拟机有什么更新
什么是OOM stackOverflowError 有哪些方法分析
jvm常用的调优参数
jvm类加载器的认识
jvm的体系结构概述
Object o = new Object();
MyObject myObject = new MyObject();
System.out.println(o.getClass().getClassLoader());
System.out.println(myObject.getClass().getClassLoader());
ClassLoader |只负责文件加载 是否可以运行由 Execution Engine决定
User.class - >ClassLoader -> user Class[模板]
方法区就是类的模板
ClassLoader 粗说3个 细说4个
启动类加载器 BootStrap C++
在rt.jar 中 系统自带 Object
扩展类加载器 Extension java
路径 jre->lib->ext
sun.misc.Launcher$AppClassLoader@18b4aac2
应用程序类加载器 AppClassLoader
MyObject myObject = new MyObject();
System.out.println(myObject.getClass().getClassLoader());
System.out.println(myObject.getClass().getClassLoader().getParent());
System.out.println(myObject.getClass().getClassLoader().getParent().getParent());
sun.misc.Launcher$AppClassLoader@18b4aac2
sun.misc.Launcher$ExtClassLoader@6e0be858
null
自定义加载器
双亲委派机制
就是从上到下找 - 案例:自己定义String类
沙箱安全 保证自己写的代码不污染JAVA 代码
native
自己搞不定 需要外援
new Thread()
thread.start() start0
thread.start() //会报错
寄存器
排版值日表
执行引擎 知道下一个要执行的方法的地址
线程私有 很小 不存在GC
方法区
1:存储类的结构信息 线程共享 较少的垃圾回收
2:方法区是规范 不同虚拟机实现不一样 永久代 元空间
重点:堆 栈stack
stack管运行 堆管存储
栈 先进后出 跟随线程的生命周期 不存在GC回收
保存哪些东西 基本类型 对象的引用变量 实例的方法
队列
栈帧 == 方法 例如: main()
栈溢出 stackOverFlowError 递归方法 无终止条件
String str = "hello";
while(true) {
str = str + new Random().nextInt(88888888)+new Random().nextInt(999999999)+new Random().nextInt(999999999)+new Random().nextInt(999999999)+new Random().nextInt(999999999);
}
// Byte[] bytes = new Byte[40 * 1024 * 1024];
java.lang.OutOfMemoryError: Java heap space
栈 堆 方法区的交互关系
指针方式对中的实例数据
栈中存指针 实例对象 来自方法区的模板
堆体系结构的概述
new新生区 伊甸园区 幸存者0from 幸存者1to
注意:from 和 to GC后存在交换 谁空谁是to
默认15次 静茹老年代区
old养老区 养老区满了就会 FullGC 如果还是不行 OutOfMenoryError
永久区==8换成元空间
新生区 1/3 伊甸园 8/10 from 1/10 2 1/10
老年区2/3
heap 堆
98%的对象都是临时对象 伊甸园生 伊甸园死
方法区 类信息 普通常量 静态变量 编译器 还有一个别名叫做 Non-heap 非堆
永久代 元空间 就是落地实现
插曲 String 是引用 但是存储在,存在常量池中 常量池 是方法区的一部分
堆参数调优入门
元空间用的是物理内存 默认只用内存的1/4
-Xms 1/64 初始
-Xmx 1/4 最大
现实:最大最小 一样大
-Xms1024M -Xmx1024M -XX:+PrintGCDetails
System.out.println(Runtime.getRuntime().maxMemory() / (double) 1024 / 1024);
System.out.println(Runtime.getRuntime().totalMemory() / (double) 1024 / 1024);
981.5
981.5
Heap
PSYoungGen total 305664K, used 15729K [0x00000007aab00000, 0x00000007c0000000, 0x00000007c0000000)
eden space 262144K, 6% used [0x00000007aab00000,0x00000007aba5c420,0x00000007bab00000)
from space 43520K, 0% used [0x00000007bd580000,0x00000007bd580000,0x00000007c0000000)
to space 43520K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007bd580000)
ParOldGen total 699392K, used 0K [0x0000000780000000, 0x00000007aab00000, 0x00000007aab00000)
object space 699392K, 0% used [0x0000000780000000,0x0000000780000000,0x00000007aab00000)
Metaspace used 3106K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 341K, capacity 388K, committed 512K, reserved 1048576K
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
GC前的内栈用 GC后新生代(新生代总大小)
[GC (Allocation Failure) [PSYoungGen: 1427K->490K(1536K)]
GC前总内存 后内存 总内存
5116K->4179K(5632K), 0.0007979 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Ergonomics
[PSYoungGen: 359K->0K(1536K)]
[ParOldGen: 3894K->1042K(4096K)] 4253K->1042K(5632K),
[Metaspace: 3209K->3209K(1056768K)], 0.0014423 secs]
[Times: user=0.00 sys=0.00, real=0.00 secs]
垃圾回收GCde理解
分代收集算法 | 次数上频繁收集YONG 次数上较少收集old 基本不动元空间 15次
先minotGC
GC算法总体概述 fullGC 要比YONGGC慢8-10被 old区比较大
sysytem.gc 手动释放
java main方法 2个线程 主线程GC线程
GC四大算法
引用计数 计数本身也有消耗 循环引用不高处理
复制算法 最常用的方法(minORgc中)
GC之后 有交换 水空谁是to
优点不存在碎片 缺点 form -》 to 一样大 消耗空间
标记清除 用在old区
可回收 标记起来 然后拔掉
1:空间节约 碎片出来 2速度慢 挑选的过程
标记压缩整理 用在old区
标记的整理一下 就不存在碎片了 缺点 就是慢工 出细活
总结