一、虚拟机内存区域
1、虚拟机内存结构
按照线程之间是否共享划分为:
线程共享:堆、方法区;
线程私有:虚拟机栈、本地方法栈、程序计数器。
1、堆:存放对象实例,几乎所有的对象实例都在这里分配。Java虚拟机规范中的描述:所有的对象实例以及数组都要在堆上分配。堆是垃圾收集器管理的主要区域。从内存回收的角度,垃圾收集器基本采用分代收集,所以Java堆还细分为:老年代,新生代;新生代又可分为,Eden区,S0,S1。从内存分配的角度,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区TLAB。
-Xmx:堆的最大值
-Xms:堆的最小值
2、方法区:存放已经被虚拟机加载的类信息,常量,静态变量,类及其方法实现。包括运行时常量池。
3、虚拟机栈:每个方法在执行的同时,都会创建一个栈桢,用于存放局部变量表、操作数栈、动态链接、方法出入参等信息。栈上分配,跟着函数调用而销毁。
局部变量表,存放了编译器可知的各种基本数据类型(int、boolean、byte、char等)、对象引用类型
4、本地方法栈:执行native方法,与虚拟机栈类似。
5、程序计数器:当前线程所执行的字节码行号指示器。如果执行的是Java方法,程序计数器记录正在执行的虚拟机字节码指令地址;如果是native方法,计数器值为空undefined。
2、虚拟机中的对象
1)分配方式:指针碰撞、空闲列表。选择哪种分配方式,要看堆是否规整,垃圾收集器是否有压缩功能,根据不同的垃圾收集器选择不同的分配方式。
2)并发安全:CAS失败重试保证更新操作原子性;本地线程分配缓冲TLAB。
二、GC
1、GC概述
1)哪些内存需要回收,which/where
2)什么时候回收,when
3)怎么回收,how
2、判断对象存活
1)引用计数法
2)可达性分析
3、各种引用
1)强引用
2)软引用
3)弱引用
4)虚引用
4、垃圾回收算法
1)标记-清除
2)复制
3)标记-整理
4)分代收集
5、垃圾收集器
并行:
并发:
1)CMS
2)G1
三、内存分配与回收策略
四、类加载机制
双亲委派模型