JDK8从永生代到元数据区
永生代
永生代默认的最大内存大小是在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从永生代到元数据区的更多相关文章
- JVM中的新生代、老年代和永生代
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- jvm 中的 ”永生代“
“方法区” 主要存储的信息包括:常量信息,类信息,方法信息,而且是全局共享的(多线程共享): jvm 有多种实现方式(不同的厂商): 并不是所有的jvm 都有永生代的概念: 通常情况下, 很多人把 “ ...
- HotSpot Java虚拟机中的“方法区”“持久代”“元数据区”的关系?
Sun/Oracle JDK的HotSpot VM中,直到JDK7都有“持久代”(Permanent Generation,简称PermGen).也称为方法区.Oracle JDK8的HotSpot ...
- jdk8永久代从方法区移除的验证
/*** 测试使用jdk8中是否仍然可以使用永久代* jvm options * -Xms20m -Xmx20m -Xmn10m -XX:PermSize=10m -XX:MaxPermSize=10 ...
- 常量池、perm(持久代)、方法区、栈
常量池.perm(持久代).方法区.栈 常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据. 除了包含代码中所定义的各种基本类型(如:int.long等等)和对象型(如St ...
- JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化
JVM的知识这里总结的很详细:https://github.com/doocs/jvm/blob/master/README.md,因此在本博客也不会再对其中的东西重复总结了. 现在很多文章关于JVM ...
- Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
在<Java对象在Java虚拟机中的创建过程>了解到对象创建的内存分配,在<Java内存区域 JVM运行时数据区>中了解到各数据区有些什么特点.以及相关参数的调整,在<J ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- jvm——metaspace代替永久代
https://mp.weixin.qq.com/s?__biz=MzIzNjI1ODc2OA==&mid=2650886860&idx=1&sn=f8bc6ab03d7a07 ...
随机推荐
- 一种动态的样式语言--Less 之 命名空间
LESS 命名空间 如果想更好的组织CSS或者单纯是为了更好的封闭,将一些变量或者混合模块打包起来,你像下面这样在#bundle中定义一些属性集之后可以重复使用: #bundle{ .button() ...
- 对ABBYY FineReader功能的探究
ABBYY FineReader,一个强大的PDF阅读器和OCR识别器! 阅读主界面 OCR主界面 资源就不贴了,不过提示一下大家:Google Search 懒 得 勤 快,就可以找到. 经过研究, ...
- docker安装 与 基本配置
1.安装docker #yum remove docker \ docker-common \ container-selinux \ docker-selinux \ docker-engine \ ...
- 微信小程序for循环中传递动态参数
for循环中的参数,没法传到对应的 js里,所以直接在 wxml页面上跳转 发送参数的 wxml页面 <view class="uploader" wx:for=" ...
- Centos 7.x卸载ibus黑屏修复及fcitx搜狗拼音安装方法
ibus黑屏修复 百度出来的fcitx安装方法,都要卸载ibus,如果没有注意同时卸载掉的依赖包的话,gnome桌面中的一些关键库也没被卸载. 修复方法很简单,重新安装Gnome sudo yum - ...
- 【转】MySQL的安装与配置——详细教程-window系统下
https://www.cnblogs.com/winton-nfs/p/11524007.html 免安装版的Mysql MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库 ...
- easyui datagrid的editor编辑器如何为validatebox控件添加改变事件
项目中需要为行编辑器Editor的某个列的文本框添加改变事件 需求:新增行时,为用户名输入特殊字符进行验证,不允许保存用户数据 html页面 <table id="gridlist&q ...
- H5+js调用相机
在机缘巧合之下,了解到用HTML5和javascript调用摄像头来实现拍照功能,今天就把大致原理写下来.页面布局很简单,就是一个input标签,两个HTML5元素video.canvas和一个but ...
- SVN 从主干合并到分支库
主干库:平时开发用的库, 分支库:中途需要进行上生产环境的库 分支库的版本从主干库拉过去就行 红色的为分支库. 创建的速度很快. 1.创建好后,在主干库添加一个文件. 2.然后分支库进行合并,这里用e ...
- zookeeper从3.4.8升级到3.4.14
升级背景说明: 最近在做系统安全扫描时,扫出来zookeeper存在安全漏洞 Apache Zookeeper 缓冲区溢出漏洞(CVE--) 官方给出的升级建议: 地址:https://zookeep ...