OOM,你好
听说面试的java的人,总会被问你懂JVM么,知道垃圾回收机制么,进行过高并发编程么。自己在开发过程中也会遇到java.lang.OutOfMemoryError这样的错误,简称内存溢出OOM。
OOM出现的原因归根结底就是运行Java程序的堆内存满了,jvm就开始清理垃圾,又因为可清理的垃圾很少,内存还是不够用,或者基本上没有垃圾,导致程序没有内存可以用了,只能通过OOM宣布自己崩了。
有的同学就说了,我可以通过-Xmx1024m来增加我的程序内存为1G或者更大,这样OOM就不会出现了。其实不然,当对象无法回收的时候在某一时刻还是会OOM。那到底什么是可回收,什么无法回收。
谁是垃圾
垃圾的真实面目还是对象。只是用完了没人再用了就变成了垃圾。怎么判断对象是否可用呢,有一种算法叫做可达性算法,说白了就是new出来的对象没有被引用的时候,就是不可达的,就成了垃圾。
例如下面代码:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
GirlFriend girl = new GirlFriend();
// girl指向了null,不再指向new出来的对象,new出来的对象就变成了垃圾
girl = null;
// 手动启动垃圾回收,girl被回收
System.gc();
}
}
class GirlFriend {
private int age;
private int name;
}
GC有什么
- 垃圾回收器:说白了就是不同工具,都能清理垃圾,只是清理的效率不一样。新生代有新生代专用的,老年代有自己专用的,还有通用的。不吹不黑,U1S1,垃圾回收器用G1就行
- GC类型:JVM将heap(堆,就是内存)分为了新生代、老年代,各个代清理垃圾的时候都有自己的行动代号
- 回收算法:垃圾回收器对应了各自的回收算法。
笔记分享
下面是在学gc的时候自己做的笔记,分享一波。
结语
好记性不如烂笔头。共勉,晚安!