JVM(虚拟机),包括class文件编译区(经过编译的class文件)、类加载器系统(类加载器【自定义加载器、应用程序加载器、扩展类加载器、引导类加载器】)、运行时数据区(如下图)、执行引擎(进行代码的执行操作)、本地方法接口、本地方法库。
Tip:在jdk1.8之后,针对Hotspot VM,方法区改为元空间,具体变化体现在,元空间使用本地内存,且在配置上也有区别。
jdk1.8之前,为方法区分配大小的参数为:
-XX:PermSize | 设置持久代 | Jdk7版本及以前版本 |
-XX:MaxPermSize | 设置最大持久代 | Jdk7版本及以前版本 |
jdk1.8后:
-XX:MetaspaceSize | 元空间大小 | Jdk8版本 |
-XX:MaxMetaspaceSize | 最大元空间 | Jdk8版本 |
1、关于垃圾回收:
垃圾回收主要发生在堆区,堆区划分为新生代和老年代。新生代具体可划分为伊甸园区(Eden区),S0区,S1区。在jvm中Eden:S0:S1比例为8:1:1,该比例通过-XX:SurvivorRatio来调整。
当Eden区满后,根据GCRoot,将其放入S0或者S1区(S0和S1采用复制算法),判断S0和S1存活达15次的对象(注:15是默认值,可通过-XX:MaxTenuringThreshold=N来调整),将符合条件的对象尝试放入老年代,如果发现老年代放不下,老年代会触发Major GC,再次尝试放入老年代,如果老年代还放不下,触发Full GC(对老年代和新生代进行垃圾回收),如果还放不下,则报OOM。
对于大对象:新生代放不下,触发Minor GC,对新生代进行垃圾回收,如果新生代放不下,则尝试直接放入老年代,如果老年代放不下,触发Major GC,再次尝试放入老年代,如果老年代还放不下,触发Full GC(对老年代和新生代进行垃圾回收),如果还放不下,则报OOM。
2、垃圾回收器