初识JVM
- JVM体系结构
- JVM 调优99%都是对于堆区(方法区是特殊的堆)而言的。
1. 类加载器
- 作用:加载Class文件~,如 new Student(),引用放到栈里面,具体实例放到堆里面;
- 虚拟机自带的加载器
- 启动类(根)加载器
- 扩展类加载器
- 应用程序加载器
- 双亲委派机制:为了安全
2.方法区
- 存放static , final, Class(类模板), 常量池;
3.栈:数据结构,先进后出
- 程序正在执行的方法,一定会在栈的顶部!
- 栈满了:StackOverflowError
4.栈+堆+方法区的交互关系:
5.堆!heap!
- 一个JVM只有一个堆内存! 堆内存的大小是可以调节的。
- GC垃圾回收,主要是在幸存区和养老区。
- 假设内存满了,OOM!(java.lang.OutOfMemoryError:Java heap space),堆内存不够!
- 下方空白小框为常量池!
- 默认情况下,分配的总内存,是电脑内存的1/4,而初始化的内存:1/64;
- 经过计算,元空间是逻辑上存在而物理上不存在的。
- OOM的处理:
-
- 尝试扩大堆内存看结果
-
- 分析内存,看一下哪个地方出现了问题(专业工具)。Jprofile
-
6.GC
- GC的作用区域:
- GC算法:
- 复制算法
- 每次GC之后Eden区和to区都为空。
- 标记清除压缩算法
- GC算法总结:
JMM:Java Memory Model
- JMM是干什么的?
用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。