内存溢出:
当程序运行的占用空间超过了JVM
所分配的最大内存时会造成。代码的实际有问题(递归容易造成)。
内存泄露:
一般是由于程序员的不正当操作引起的内存浪费。被浪费掉的内存不会被程序所使用。
JAVA
分代垃圾回收策略
依次划分为:
年轻代、老年代、持久代
年轻代
分为三个区:一个Eden
区、两个
Survivor
区。(两个
Survivor
区是对称的,没有顺序)
新创建的对象先存放在年轻代中,大部分对象都存放在Eden
区,当
Eden
区满后,存放到一个
Survivor
区,当该
Survivor
满后,再复制存放到另一个
Survivor
区,当该
Survivor
去也满后,那么就可以把从上个
Survivor
区中复制过来并且依然存活的对象复制到
老年代
中。
当需要增加对象在年轻代中存放的时间,我们可以配置多个Survivor
区(必须保证有一个空
Survivor
区)。
持久代
存放JAVA
类、方法等,持久代的空间也可以通过配置扩展。
垃圾回收的时机
分为两个时机:Scavenge GC
和
Full GC
Scavenge GC
:
当新创建的对象在申请Eden
区失败的时候会触发
Scavenge GC
,将会对
Eden
区进行垃圾回收,清理掉非存活的对象,并将存活的对象移动到
Survivor
区。
Eden
区比较小,垃圾回收比较频繁。
Full GC
:
Full GC
对整个堆进行整理,所以要比
Scavenge GC
慢。在做
JVM
调优的时候一大部分就是在做
Full GC
调节。
导致Full GC
的可能有:
①
老年代满了;
②
持久代满了;
③
显式调用了
System.gc()
;
④
上一次
GC
之后堆的各域分配策略动态变化。