JVM运行时数据区-方法区

版权声明:非商业目的可自由转载,转载请标明出处 https://blog.csdn.net/u010013573/article/details/83965528

基本概念

     在hotspot jvm实现当中,在jdk8以前,方法区的实现为PermGen,即永久代,主要存放类的信息,方法的信息,常量池,静态变量,符号解析;而jdk8+,则去除了PermGen,使用元空间MetaSpace代替,元空间使用的是本地内存,理论上可以无限大,最大大小指受限于本地内存大小,所以不会在出现outOfMemoryError:PermGen的异常。同时在jdk8+,原在PermGen的字符串常量移动到了堆,所以堆会有所变大。

JVM参数解析

     PermGen相关

jdk8以前,主要参数为MaxPermSize和PermSize,分别用于设置持久代的最大大小,默认为64M和初始大小。而jdk8+,设置这两个参数则会提示警告。jdk8+做出去除PermGen,改用MetaSpace的原因是JVM启动时,会根据分配PermSize大小的连续空间,如果程序用不上,则造成浪费;同时由于是固定的,无法确定多大合适,不方便调优。

    MetaSpace相关

初始默认大小为20.8M,与MetaspaceSize和MaxMetaspaceSize的设置无关;MetaspaceSize参数,即-XX:MetaspaceSize=xxM,用于设置当MetaSpace达到xxM时,则发送FGC,且之后每次扩容都会发送FGC;MaxMetaspaceSize参数:设置元空间的最大大小,默认为无上限,不过如果无上限,则在发生内存泄露时,则可能会被OS kill掉。经验上,MetaspaceSize和MaxMetaspaceSize可以设置为一样,且对大多数项目256M足够。同时,在程序运行一段时间稳定后,可以通过命令:jstat -gc pid,查看实际大小。同时这两个参数不能设置过小,否则会发生频繁FGC,甚至OOM。

猜你喜欢

转载自blog.csdn.net/u010013573/article/details/83965528