1. 什么是java垃圾回收机制
垃圾回收机制不定时,向堆内存清理不可达对象。
finalize() 垃圾回收之前执行的方法
public static void main(String[] args) {
Test test=new Test(); //如果没使用test是算不可达(没有被引用)
test=null; //设置null大概率会回收
System.gc();//手动回收垃圾
}
@Override
protected void finalize() throws Throwable {
System.out.println("垃圾回收机制之前...");
}
2. 内存溢出、内存泄漏区别
内存溢出:需要4g内存,只支持3g内存 算溢出
内存泄漏:定义很多静态变量,垃圾不会去回收,这个对象又没被引用,报错泄漏
(浪费造成的内存泄漏)
3. gc垃圾回收机制---->算法
a. 引用计数法 ---->eden区
User user=new User();
给对象添加一个引用计算器,有一个初试次数(15次),不被引用-1,被引用+1,如果当对象被标记次数为0就会被回收。如果次数大于15次后就会进入s0或者s1区。
b. 标记清除法 ---->老年代
为每个对象作一个标记,0可达,1不可达。通过改变其标记状态码来判断是否被清除,因为是个体清除,可能会出现垃圾碎片。
c. 标记压缩法 ---->老年代
标记算法用在老年代是因为新生代创建比较频繁。
在标记清除基础之上做了优化,把存活的对象压缩到内存一端,而后进行垃圾清理。
d. 复制算法 ---->新生代 s0 s1(大小相同)
主要处理s0 s1新生代区域的对象,如果s0对象里面有部分对象不可达,将可达对象移动(复制)到s1区,清楚掉s0区域的所有对象
e. 分代算法 ---->新生代 老年代
根据内存中对象的存活周期不同,将内存划分为几块,然后存放这些对象,然后根据不同算法进行回收。
4. 垃圾收集器
串行收集器 —> 单线程收集垃圾 效率低
并行收集器 —> 多线程 效率高
jvm参数调优
-XX:+PrintGCDetails -Xmx32M -Xms32M
-XX:+HeapDumpOnOutOfMemoryError
-XX:+UseSerialGC
-XX:PermSize=32M
ps: 单纯记录自己所学记录------------仅供参考