1. JAVA内存模型
image.png- 程序计算器是一块较小的内存空间,线程私有的,可以看作是当前线程所执行的字节码的行号指示器。
- 虚拟机栈也是线程私有的,每个方法在执行时都会创建一个栈桢,用于存放局部变量表、操作数栈、动态链接、方法出入口等信息。
- 本地方法栈与虚拟机栈功能相似,它主要用于存储native方法的信息。
- 堆是java内存占用最大的一块,被所有线程共享,用于存放实例对象。
- 方法区也是所有线程共享的,用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。
注:JDK1.8中,虚拟机用元空间取代了永久代(HotSpot中将方法区取名为永久代),且元空间是使用的本地内存,而非虚拟机内存。另外,字符串常量保存在堆中了。
2. 确认对象是否还活着的方法
- 引用计数法
- 可达性分析
ps:引用类型可分为强引用、软引用、弱引用、虚引用
3. 垃圾收集算法
- 标记清除
- 标记整理
- 复制算法
- 分代收集算法
4. 垃圾收集器
image.png- Serial 采用复制算法,单线程的。只会用一个CPU或者线程去进行垃圾收集,并且会暂停其他所有工作线程(Stop The World)
- ParNew 采用复制算法,是Serial的多线程版本。
- Parallel Scavenge 采用复制算法,并行的多线程收集器。它的特点是关注点与其他收集器不一样,其他收集器的关注点是尽可能的缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的关注点是达到一个可控制的吞吐量。所谓吞吐量是CPU用于运行用户代码的时间与CPU总的消耗时间的比值。
- Serial Old 采用标记整理算法,是Serial的老年代版本。
- Parallel Old 采用标记整理算法,是Parallel Scavenge的老年代版本。
-
CMS 采用标记清除算法,是一种获取最短停顿时间为目标的收集器。收集过程分为初始标记、并发标记、重新标记、并发清除。其中初始标记和重新标记会STW,不过这两个过程耗时不长,并发标记是耗时最长的。并发标记和并发清除会与用户线程同时执行。缺点:CPU资源敏感、浮动垃圾、内存碎片
-G1 最前沿的垃圾收集器,有并发收集、分代收集、空间整理、可预测停顿等特点。大体过程可分为初始标记、并发标记、最终标记、筛选回收
5. 内存分配与回收策略
- 对象优先分配在Eden区
- 大对象直接进入老年代
- 长期存活的对象将进入老年代(默认15岁)
- 动态对象年龄判定(相同年龄所有对象大小超过Survivor空间的一半,年龄大于等于该年龄的对象直接进入老年代)
- 空间分配担保
6. 类加载器
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
- 自定义类加载器
ps:双亲委派模型
7. 类加载过程
image.png8. JDK工具
- jps 显示指定系统所有的HotSpot所有虚拟机进程
- jstat 收集虚拟机各方面的运行数据
- jinfo 显示虚拟机配置信息
- jmap 生产虚拟机内存快照
- jstack 显示虚拟机的线程快照
网友评论