这一版延续Java深究1中的继续进行相应补充。
1.先看一个问题,什么是Java多态,我们知道面向对象的三大特点,封装,继承,多态,前两者好理解,多态要怎么理解呢?我们可以想象到有了继承关系,那么肯定会出现这种:
class A extends B{
void eat(){
}
}
class C extends B{
void eat(){
}
}
所以可以出现:A a = new B(); B b = (B)a;此时的父类A就有多种表现形态了,此时调用a.eat()那么就调用的B类的eat方法。
2.常见OOM现象:
1)Heap区的OOM,OutOfMemorryError.这实际上就是内存泄露,其原因就是Old区域剩余的内存空间大小不足于满足晋升到Old区域的对象的大小。
出现内存泄露有可能的原因是:死循环写入,或者一个全局区域增加数据导致隐藏的数据膨胀,还有一种内存泄露,就是内存可能在某些使用的情况下增加几十字节的空间没释放,刚开始发现可以被GC掉,但是每次GC都会膨胀那么一点,当运行一段时间后,会发现系统运行很慢,原因是系统不停得在做FULL GC,而且每次做FULL GC的时间非常长,因为绝大多数对象存活着,由于标记存活对象需要更多时间,下面这段代码并不会导致内存泄露,但是会导致频繁的Full GC其原因是每次GC完后会释放一点点内存,然后又一下子满了,就会FULL GC,如此不断反复,当FULL GC时间达到一定比例时就会报错。