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(最大堆) 设置为一样禁止自动扩展堆内存。