1、jvm 内存模型
程序计数器(Program Counter Register):
- 记录正在执行的虚拟机字节码指令的地址
- 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的区域
虚拟机(VM Stack)
- 描述的是JAVA方法执行的内存模型,每个方法在执行的时候都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法接口等信息
- 局部变量表存储了编译期可知各种基本数据类型、对象引用
- 线程请求的栈深度不够会报StackOverflowError异常
- 栈动态扩展的容量不够会报OutOfMemoryError异常
- 虚拟机栈是线程隔离的,即每个线程都有自己独立的虚拟机栈
本地方法:Native Stack
- 本地方法栈类似于虚拟机栈,只不过本地方法栈使用的是本地方法
堆:Heap
- 几乎所有的对象实例都在堆上分配内心
2、堆
所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域,也称为“GC堆”,也是我们优化考虑最多的地方。
新生代
- Eden空间
- From Survivor空间(S0)
- To Survivor空间(S1)
老年代
永久代/元空间
- Java8以前永久代受jvm管理,Java8以后元空间直接使用物理内存。因此,默认情况下,元空间的大小仅受本地内存限制。
3、垃圾回收
4、jvisualvm
5、内存溢出(out of memory)& 内存泄漏(memory leak)
内存溢出:是指程序在申请内存时,没有足够的内存空间供其使用,比如你需要100M的空间,系统只剩90M了,出现out of memory。
内存泄漏:是指程序在申请内存后,无法释放已申请的内存空间。
memory leak会最终会导致out of memory!