JAVA中的内存溢出、内存泄漏以及垃圾回收

内存溢出:
当程序运行的占用空间超过了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 之后堆的各域分配策略动态变化。

猜你喜欢

转载自blog.csdn.net/zhang_pengcheng/article/details/79432072