JVM堆分为
-
新域:存储所有新生成的对象(使用“停止-复制”算法进行清理)
- 新生代内存分为2部分,1部分 Eden区较大,1部分Survivor比较小,
- 并被划分为两个等量的部分。
- 新生代内存分为2部分,1部分 Eden区较大,1部分Survivor比较小,
- 旧域:新域中的对象,
- 经过了一定次数的GC循环后,
- 被移入旧域(算法是标记-整理算法)
- 永久域:存储类和方法对象,
- 从配置的角度看,这个域是独立的,不包括在JVM堆内(方法区)。
- 默认为4M。
- 方法区(永久域):
- 永久域的回收有两种:
- 常量池中的常量,无用的类信息,
- 常量的回收很简单,没有引用了就可以被回收。
- 对于无用的类进行回收,必须保证3点:
- 类的所有实例都已经被回收
- 加载类的ClassLoader已经被回收
- 类对象的Class对象没有被引用(即没有通过反射引用该类的地方)
- 永久代的回收并不是必须的,可以通过参数来设置是否对类进行回收。
- 永久域的回收有两种:
示例图: