美文网首页jvm
服务端JVM- Metaspace 调优【五】

服务端JVM- Metaspace 调优【五】

作者: Coding测试 | 来源:发表于2019-12-02 17:14 被阅读0次

metaspace存储空间简介:

从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。当然你也可以通过以下的几个参数对Metaspace进行控制:

-XX:MetaspaceSize=N 

这个参数是初始化的Metaspace大小,该值越大触发Metaspace GC的时机就越晚。随着GC的到来,虚拟机会根据实际情况调控Metaspace的大小,可能增加上线也可能降低。在默认情况下,这个值大小根据不同的平台在12M到20M浮动。使用java -XX:+PrintFlagsInitial命令查看本机的初始化参数,-XX:Metaspacesize为21810376B(大约20.8M)。

-XX:MaxMetaspaceSize=N 

这个参数用于限制Metaspace增长的上限,防止因为某些情况导致Metaspace无限的使用本地内存,影响到其他程序。在本机上该参数的默认值为4294967295B(大约4096MB)。

-XX:MinMetaspaceFreeRatio=N 

当进行过Metaspace GC之后,会计算当前Metaspace的空闲空间比,如果空闲比小于这个参数,那么虚拟机将增长Metaspace的大小。在本机该参数的默认值为40,也就是40%。设置该参数可以控制Metaspace的增长的速度,太小的值会导致Metaspace增长的缓慢,Metaspace的使用逐渐趋于饱和,可能会影响之后类的加载。而太大的值会导致Metaspace增长的过快,浪费内存。

-XX:MaxMetasaceFreeRatio=N 

当进行过Metaspace GC之后, 会计算当前Metaspace的空闲空间比,如果空闲比大于这个参数,那么虚拟机会释放Metaspace的部分空间。在本机该参数的默认值为70,也就是70%。

-XX:MaxMetaspaceExpansion=N 

Metaspace增长时的最大幅度。在本机上该参数的默认值为5452592B(大约为5MB)。

-XX:MinMetaspaceExpansion=N 

Metaspace增长时的最小幅度。在本机上该参数的默认值为340784B(大约330KB为)。

---------------------------------------------------------------

元空间的特点

1、充分利用了Java语言规范中的好处:类及相关的元数据的生命周期与类加载器的一致。

2、每个加载器有专门的存储空间

3、只进行线性分配

4、不会单独回收某个类

5、省掉了GC扫描及压缩的时间

6、元空间里的对象的位置是固定的

7、如果GC发现某个类加载器不再存活了,会把相关的空间整个回收掉

Metaspace调优

使用-XX:MaxMetaspaceSize参数可以设置元空间的最大值,默认是没有上限的,也就是说你的系统内存上限是多少它就是多少。-XX:MetaspaceSize选项指定的是元空间的初始大小,如果没有指定的话,元空间会根据应用程序运行时的需要动态地调整大小。

MaxMetaspaceSize的调优

-XX:MaxMetaspaceSize={unlimited}

元空间的大小受限于你机器的内存

限制类的元数据使用的内存大小,以免出现虚拟内存切换以及本地内存分配失败。如果怀疑有类加载器出现泄露,应当使用这个参数;32位机器上,如果地址空间可能会被耗尽,也应当设置这个参数。

元空间的初始大小是21M——这是GC的初始的高水位线,超过这个大小会进行Full GC来进行类的回收。

如果启动后GC过于频繁,请将该值设置得大一些

可以设置成和持久代一样的大小,以便推迟GC的执行时间

-----------------------------------------------------------------------------------------------------

JAVA的对象大小

基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:

Object ob = new Object();

这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所需要的空间。而那8byte则是Java堆中对象的信息。

因为所有的Java非基本类型的对象都需要默认继承Object对象,因此不论什么样的Java对象,其大小都必须是大于8byte。

有了Object对象的大小,我们就可以计算其他对象的大小了。

Class NewObject {    int count;    boolean flag;    Object ob;}

其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因为Java在对对象内存分配时都是以8的整数倍来分,因此大于17byte的最接近8的整数倍的是24,因此此对象的大小为24byte。

这里需要注意一下基本类型的包装类型的大小。因为这种包装类型已经成为对象了,因此需要把他们作为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少需要的空间),而且12byte没有包含任何有效信息,同时,因为Java对象大小是8的整数倍,因此一个基本类型包装类的大小至少是16byte。

这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。因此,可能的话应尽量少使用包装类。在JDK5.0以后,因为加入了自动类型装换,因此,Java虚拟机会在存储方面进行相应的优化。

相关文章

  • 服务端JVM- Metaspace 调优【五】

    metaspace存储空间简介: 从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为M...

  • Java进阶-JVM-调优

    一、Java进阶-JVM-调优   jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更...

  • JVM-调优参数讲解

    堆配置 -Xms :初始堆大小-Xmx :最大堆大小-XX:NewSize=n :设置年轻代大小-XX:NewRa...

  • JVM-常用调优参数

    -XX:-UseBiasedLocking取消偏向锁,JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它...

  • jvm-cmd

    tools ref 2-1 2-2 2-3 2-4jdk8 Metaspace 调优 2-5 导出内存映像文件-X...

  • JVM调优

    1 调优层次 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代...

  • Memcached服务级调优

    1 Memcached服务端调优思路解析 1. 1 stats命令讲解 核心参数 3 stats其他命令简介 4 ...

  • 2021-01-17 JVM-性能调优

    垃圾收集器分类 串行收集器->Serial和Serial Old只能有一个垃圾回收线程执行,用户线程暂停适用于'内...

  • Twitter 工程师谈 JVM 调优

    一. 调优需要关注的几个方面 内存调优 CPU 使用调优 锁竞争调优 I/O 调优 二. Twitter 最大的敌...

  • Spark性能优化-开发调优

    Spark性能优化分为四个方面: 1、开发调优2、资源调优3、数据倾斜调优4、shuffle调优 1. 开发调优 ...

网友评论

    本文标题:服务端JVM- Metaspace 调优【五】

    本文链接:https://www.haomeiwen.com/subject/nvyfgctx.html