- 线程共享区
- 如何排查JVM问题
- 从加载JVM到GC清理,一共经历什么过程-√
- 如何确定对象是否需要回收
- JVM垃圾回收机制
- 什么是STW
- 常用的JVM启动参数有哪些?-※
堆区与方法区是所有线程共享的
栈区:主要存放基本数据类型与对象引用(仅限局部变量,成员变量不管是不是基本数据类型都存放于堆)
堆区:主要存放对象实例与数组[我的理解就是,由代码操作生成的对象或者说引用类型存放于堆]
方法区:类信息(class文件)、静态变量与静态方法
本地方法栈:非静态方法
空间:jmap 查看 JVM各个区域的占用情况,查看是否栈区过大?是否堆区过大?
时间:jstack 查看线程的运行情况,是否存在死锁或者阻塞?
OOM:
查看: jstat 查看垃圾回收情况,fullgc 与 younggc 的运行情况
记录: JVM启动参数 --> -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/base,发生OOM的时候记录下当时的情况-dump文件,便于回溯定位问题
分析:jvisualvm 可以针对dump文件进行分析异常对象,异常线程
1.方法区加载字节码,加载静态方法、静态成员变量
2.堆区创建实例化对象,保存至 年轻代 Eden 区
3.将引用传回栈区
4.经过minor GC,对象每次存活,年龄加一,并迁移至survival区-存活区,年龄大于等于15的时候,对象进入老年代
5.栈区的引用被移除以后,对象最终被GC回收
根可达算法:所有对象都是基于一个根对象上的,从根对象开始遍历,能找到引用的就是还需要的对象,否则就是不需要的对象。
总共三种算法:
标记:将所有对象判断是否根可达,将不可达对象标记并进行删除
缺点:会有碎片空间出现
复制法:申请一块与当前存储空间相同的空间,根可达算法标记所有存活对象,将存活对象迁移至新申请空间,迁移完毕以后,原空间统一清空
缺点:需要的空间较大
标记优化法:根可达算法标记所有存活对象,并将存活对象重新排列至连续空间,标记以及迁移排列完毕以后,将存活对象连续空间以外的空间统一清除
STW,stop the world,即,在GC运行过程中,要将所有Java进程冻结,以便于GC进程进行垃圾回收。