永生代

永生代默认的最大内存大小是在32位JVM上为64MB, 在64位JVM上为82MB。可以通过-XX:PermSize=[size]-XX:MaxPermSize=[size]来调整。

永生代包含类和方法的元数据信息, 一般情况下它需要的空间不是很大, 但是由于热部署等一些特性会导致类信息越来越多, 从而发生内存溢出(OutOfMemoryError)。

永生代的大小是在启动时指定的(通过-XX:MaxPermSize=xxm), 并且不能在运行时重新动态调整。

 

元数据区

虽然元数据区替代了永生代, 但是它还是可能发生内存溢出的, 默认情况下元数据区的大小上限即为剩余物理内存的大小, 但是也可以指定最大元数据区大小。指定元数据区大小的参数为: -XX:MaxMetaspaceSize.

元数据区会在达到指定大小时发生垃圾回收, 设置的参数是:-XX:MetaspaceSize

在元数据区也没有了klasses, 这是用来存储初始加载的类的描述信息, 意味着元数据区只存储原始类的信息。

另外还有两个参数:

-XX:MinMetaspaceFreeRatio: 当内存剩余比例小于这个值时垃圾回收会频繁一些, 默认40%。

-XX:MaxMetaspaceFreeRatio: 当内存剩余比例大于这个值时垃圾回收频率会低一点,默认70%。

 

常量池

常量池的实现为一个固定大小的hash字典, 每个桶里包含一个具有相同hash值的字符串数组。

jdk7之前常量池是在永生代中, 从jdk7开始常量池从永生代移除, 放到了堆中。

jdk6中常量池默认大小为1009,jdk6早期这个不可配置, jdk6u30到jdk6u41可配置。而在jdk7中从jdk7u02开始可以配置。从jdk7u40开始, 常量池的默认大小为60013。

参数:

-XX:PrintStringTableStatistics: JVM进程退出时会打印StringTable统计信息

-XX:StringTableSize=N指定常量池大小

 

Refer:

https://www.baeldung.com/java-permgen-metaspace

http://java-performance.info/string-intern-in-java-6-7-8/

JDK8从永生代到元数据区的更多相关文章

  1. JVM中的新生代、老年代和永生代

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  2. jvm 中的 ”永生代“

    “方法区” 主要存储的信息包括:常量信息,类信息,方法信息,而且是全局共享的(多线程共享): jvm 有多种实现方式(不同的厂商): 并不是所有的jvm 都有永生代的概念: 通常情况下, 很多人把 “ ...

  3. HotSpot Java虚拟机中的“方法区”“持久代”“元数据区”的关系?

    Sun/Oracle JDK的HotSpot VM中,直到JDK7都有“持久代”(Permanent Generation,简称PermGen).也称为方法区.Oracle JDK8的HotSpot ...

  4. jdk8永久代从方法区移除的验证

    /*** 测试使用jdk8中是否仍然可以使用永久代* jvm options * -Xms20m -Xmx20m -Xmn10m -XX:PermSize=10m -XX:MaxPermSize=10 ...

  5. 常量池、perm(持久代)、方法区、栈

      常量池.perm(持久代).方法区.栈 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据. 除了包含代码中所定义的各种基本类型(如:int.long等等)和对象型(如St ...

  6. JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化

    JVM的知识这里总结的很详细:https://github.com/doocs/jvm/blob/master/README.md,因此在本博客也不会再对其中的东西重复总结了. 现在很多文章关于JVM ...

  7. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法

    在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...

  8. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

  9. jvm——metaspace代替永久代

    https://mp.weixin.qq.com/s?__biz=MzIzNjI1ODc2OA==&mid=2650886860&idx=1&sn=f8bc6ab03d7a07 ...

随机推荐

  1. MongoDB 启动报错

    1.配置MongoDB ls /etc/mongod.conf 可以根据此配置文件启动 或者根据自己需求进行配置文件的变更 重要提醒: 如果变更MongoDB配置文件中:日志与数据文件目录,那么要把这 ...

  2. ent 基本使用九 代码生成

    ent 提供了cli 工具,可以方便我们进行schema 以及代码生成,同时目前提供的cli已经够用了 安装 cli go get github.com/facebookincubator/ent/c ...

  3. ES6基础-变量的解构赋值

    作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...

  4. [Beta阶段]第二次Scrum Meeting

    Scrum Meeting博客目录 [Beta阶段]第二次Scrum Meeting 基本信息 名称 时间 地点 时长 第二次Scrum Meeting 19/05/03 大运村寝室6楼 40min ...

  5. 【Beta】测试报告

    测试计划 一.对新增加的用户注册.登录及访问控制的测试 注册信息的填写 用户名包含纯大小写字母.数字.中文.特殊字符及几种情况的混合 密码包含大小写字母.数字和特殊字符 用户名长度不大于150个字节 ...

  6. Spring 中的事件机制

    说到事件机制,可能脑海中最先浮现的就是日常使用的各种 listener,listener去监听事件源,如果被监听的事件有变化就会通知listener,从而针对变化做相应的动作.这些listener是怎 ...

  7. php error_reporting()关闭报错

    错误报告级别:指定了在什么情况下,脚本代码中的错误(这里的错误是广义的错误,包括E_NOTICE注意.E_WARNING警告.E_ERROR致命错误等)会以错误报告的形式输出. 一.常用设置说明 er ...

  8. TP 控制器和模型里面order 写法不同

      控制器: Db::table('think_user')->where('status=1')->order('id desc')->limit(5)->select(); ...

  9. EChart 标题 title 样式,x轴、y轴坐标显示,调整图表位置等

    示例里工作一般情况是够用了,更复杂的可以查询教程: title 官方解说:http://echarts.baidu.com/option.html#title 坐标相关: X轴:http://echa ...

  10. [转]JsonCpp遍历json

    #include "json.h" typedef Json::Writer JsonWriter; typedef Json::Reader JsonReader; typede ...