永生代

永生代默认的最大内存大小是在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. Aizu2249-Road Construction-(Dijkstra)

    https://vjudge.net/problem/Aizu-2249 题意:计划图中有n个城市m条路,首都是1号城市,要选一些路去修,让各个城市到首都的路径最短,在路径最短的情况下修路费用最小. ...

  2. base64编码与解码

    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ...

  3. MongoDB shell 5 游标方法

    方法名 描述 cursor.snapshot()   cursor.itcount()   cursor.batchSize()   cursor.pretty()   cursor.hint()   ...

  4. 享元模式(Flyweight Pattern)

    定义: 采用一个共享来避免大量拥有相同内容对象的开销.这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效的支持大量的细粒度对象. 享元的英文是flyweight,是一个来自体育方面的专业 ...

  5. 二叉树 B-树B+树

    聚集索引和非聚集索引结构参考:http://blog.csdn.net/cangchen/article/details/44818623 前两天有位朋友邀请我回答个问题,为什么 MongoDB (索 ...

  6. 用SAS提交SAS代码

    OPTIONS NOXWAIT;%LET PATH=%STR(C:\Program Files\SAS\SAS 9.1);%LET CODEPATH=%STR(D:\001.RIPP.MODEL);% ...

  7. tomcat中文乱码

    1. https://blog.csdn.net/qq_35038153/article/details/78430359 2. 1.修改apache-tomcat-9.0.14-windows-x6 ...

  8. sql server数据库备份单个表的结构和数据生成脚本【转】

    1.使用场景:sql server数据库备份单个表的结构和数据,在我们要修改正式系统的数据的一天或者多条某些数据时候,要执行update语句操作,安全稳健考虑,最好先做好所修改的表的结构和数据备份! ...

  9. CentOS7静默安装Oracle 18g数据库(无图形化界面)

    说明: 因为是静默安装,所以我们不需要安装图形界面 准备:下载Oracle软件 官方网站:http://www.oracle.com/technetwork/database/enterprise-e ...

  10. docker 安装jenkins 发布 asp.net core 2.0

    安装Docker 其实安装Docker的过程,大家可以到Docker官网找到自己相对应的安装文档进行安装,Docker区分CE和EE的两个版本,具体这两个版本有什么区别,大家自行查阅相关资料,这里不再 ...