栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

jvm设置方法区大小的参数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

jvm设置方法区大小的参数

jdk7及以前:

通过-XX:PermSize 来设置永久代初始分配空间,默认值是20.75m
-XX:MaxPermSize来设定永久代最大可分配空间,32位是64m,64位是82m

jdk8及之后:

通过-XX:metaspaceSize 来设置永久代初始分配空间,默认值是21m
-XX:MaxmetaspaceSize来设定永久代最大可分配空间,值为-1

由于没有上限,因此当本机内存耗尽时,会抛出oom的错误,对于起始值21m来说,如果所使用的内存超过这个值,则会触发full gc卸载没用的类,之后将会重置这个初始值,新的初始值的高低在于gc后释放了多少的空间,释放得少则提升这个初始值,释放得多则降低这个初始值。因此在实际的开发场景中,为了减少full gc的频率,会将这个初始值设置大一些。

代码示例:
通过for循环不停创建类,直到溢出为止。
设置jvm参数:-XX:metaspaceSize=10m -XX:MaxmetaspaceSize=10m

package com.lydon.test;


import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.Opcodes;


public class OOMTest extends ClassLoader{


    public static void main(String[] args) {
        int j=0;
        OOMTest test =new OOMTest();


        try{
            for (int i = 0; i <100000 ; i++) {
                ClassWriter classWriter=new ClassWriter(0);
                //指明版本号,修饰符,类型,包名,父类,接口
                classWriter.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class"+i,"com.lydon.test","java/lang/Object",null);
                byte[] code=classWriter.toByteArray();
                test.defineClass("Class"+i,code,0,code.length);
                j++;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            System.out.println(j);
        }
    }
}

输出结果:

D:Javajdk1.8.0_121binjava.exe -XX:metaspaceSize=10m -XX:MaxmetaspaceSize=10m "-javaagent:D:IntelliJ IDEA 2021.1libidea_rt.jar=63745:D:IntelliJ IDEA 2021.1bin" -Dfile.encoding=UTF-8 -classpath D:Javajdk1.8.0_121jrelibcharsets.jar;D:Javajdk1.8.0_121jrelibdeploy.jar;D:Javajdk1.8.0_121jrelibextaccess-bridge-64.jar;D:Javajdk1.8.0_121jrelibextcldrdata.jar;D:Javajdk1.8.0_121jrelibextdnsns.jar;D:Javajdk1.8.0_121jrelibextjaccess.jar;D:Javajdk1.8.0_121jrelibextjfxrt.jar;D:Javajdk1.8.0_121jrelibextlocaledata.jar;D:Javajdk1.8.0_121jrelibextnashorn.jar;D:Javajdk1.8.0_121jrelibextsunec.jar;D:Javajdk1.8.0_121jrelibextsunjce_provider.jar;D:Javajdk1.8.0_121jrelibextsunmscapi.jar;D:Javajdk1.8.0_121jrelibextsunpkcs11.jar;D:Javajdk1.8.0_121jrelibextzipfs.jar;D:Javajdk1.8.0_121jrelibjavaws.jar;D:Javajdk1.8.0_121jrelibjce.jar;D:Javajdk1.8.0_121jrelibjfr.jar;D:Javajdk1.8.0_121jrelibjfxswt.jar;D:Javajdk1.8.0_121jrelibjsse.jar;D:Javajdk1.8.0_121jrelibmanagement-agent.jar;D:Javajdk1.8.0_121jrelibplugin.jar;D:Javajdk1.8.0_121jrelibresources.jar;D:Javajdk1.8.0_121jrelibrt.jar;D:workspacejvm-demochapters09targetclasses com.lydon.test.OOMTest
8271
Exception in thread "main" java.lang.OutOfMemoryError: metaspace
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at com.lydon.test.OOMTest.main(OOMTest.java:18)


Process finished with exit code 1
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424656.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号