面试集锦(五)javaGC&JVM

201 阅读2分钟

java gc

1.判断哪些内存应该回收:

算法:可达性分析算法

描述:可达性算法是通过一个称为 GC Roots 的对象向下搜索,整个搜索路径就称为引用链,当一个对象到 GC Roots 没有任何引用链 JVM 就认为该对象是可以被回收的。

回收算法

      1.标记~消除算法(即先标记哪些需要回收,然后同一消除),效率低

      2.标记~整理算法(与标记-消除算法类似,只是最后一步消除的时候将存活的对象移动到一端,然后将边界外的全部消除),老年代gc

      3.复制算法(将内存分为两份,每次只使用其中的一份,发生垃圾回收的时候将存活的对象全部复制到另一块,然后对之前的区域全部消除),适合新生代gc

      4.分代收集算法(主要),对于不同的代采用不同的收集算法

新生代存活对象少:所以采用复制算法;老年代对象多,所以采用标记消除或标记整理算法

jvm相关

类加载(装载连接初始化):采用的是双亲委派模型

classload类加载器,加载类文件到内存

步骤:

1.装载,查找和导入class字节码文件

2:链接:

(1)检查错误:检查导入的类文件的正确性

(2)为静态变量分配空间

(3)解析:虚拟机常量池的符号引用替换为字节引用过程

3.初始化,初始化静态变量,静态代码块,查看某个类的父类有没有被初始化,没有的话会初始化他的父类。

java中的堆,栈,常量池存放的数据

堆:存放所有new出来的对象和全局变量,静态变量,成员变量,链表

栈:存放基本类型的变量数据和对象的引用(注意是引用),局部变量(如果使用final修饰的话放在堆中),数组,生命周期过了以后会自动释放

常量池:字符串常量和基本类型常量

OOM分析(out of memery):java堆内存溢出

只要在java堆中不断的创建对象,并且对象之间存在引用链,jvm就不会回收从内存导致内存溢出。

解决办法:只要将-Xms(最小堆),-Xmx(最大堆) 设置为一样禁止自动扩展堆内存。