JVM的区域总体分为两类:
- 堆区(Heap)
- 非堆区
Heap
堆区又分为:
- Young Gen
- Eden Space
- Survivor Space
- From Space
- To Space
- Old Een(老年代)
非Heap
非堆区又分为:
- Code Cache(代码缓存区)
- Perm Gen(永久代)
- Jvm Statck(虚拟机栈)
- Local Method Statck(本地方法栈)
年轻代
HotSpot JVM把年轻代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to)。默认比例为8:1。
old老年代
老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。
Code Cache代码缓存区
它主要用于存放JIT所编译的热点代码。CodeCache代码缓冲区的大小在client模式下默认最大是32m,在server模式下默认是48m,这个值也是可以设置的
Perm Gen(永久代)
Perm Gen全称是Permanent Generation space,称之为永久代,其实指的就是这个方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。
由于方法区主要存储类的相关信息,Class在被Load进入这个区域后,如果应用程序LOAD很多Class的话,就很可能会出现PermGen space错误,比如对于动态生成类的情况比较容易出现永久代的内存溢出
JDK1.8之后被元空间替代