前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >撩改JVM常见调优参数

撩改JVM常见调优参数

作者头像
石的三次方
发布2021-01-05 22:47:52
8690
发布2021-01-05 22:47:52
举报
文章被收录于专栏:石的三次方石的三次方

JVM参数

1. 标配参数

代码语言:javascript
复制
java -version
java -help
java =showversion

2. -X参数

代码语言:javascript
复制
-Xint  //解释执行
-Xcomp //第一次使用就编译成本地代码
-Xmixed //混和模式

3. -XX参数

3.1 Boolean类型

「公式:-XX:+代表增加,-代表剔除某个属性值」

查看某个Java进程是否开启了某些JVM参数的方法:

  • jps -l获取所有后台运行的Java进程
  • jinfo -flag JVM参数 进程ID获取这个Java程序对该JVM参数的开启状况

**案例:**当前程序是否打印了GC收集细节

代表当前程序没有开启垃圾回收

这是开启以后的

3.2 KV类型

「公式:-XX:属性key=属性值value」

「案例:」

-XX:MetaspaceSize=128m修改元空间大小

-XX:MaxTenuringThreshold修改对象最大存活年龄

-XX:InitialHeapSize初始堆大小

「修改前」

「修改后」

jinfo -flags获取所有JVM开启的参数」

3.2.1 Xms和-Xmx

XmsXmx分别代表堆的标准大小和最大空间。

Xms相当于-XX:InitialHeapSize

Xmx相当于-XX:MaxHeapSize

3.3 查看JVM默认参数

java -XX:+PrintFlagsInitial -version打印Java版本信息和初始默认JVM参数设置

java -XX:+PrintFlagsFinal -version打印被更新过的JVM参数设置

  • 冒号表示由于平台或者开发者的缘故导致该参数被修改

java -XX:+PrintCommandLineFlags打印一些基本信息,包括使用的垃圾回收器

打印了使用的垃圾回收器

4. JVM常用参数

代码语言:javascript
复制
-Xms 初始大小为物理内存的1/64  等价于-XX:InitialHeapSize
-Xmx 默认为物理内存的1/4    等价于-XX:MaxHeapSize
-Xss 单个线程栈大小 一般为512~1024k
-Xmn 设置年轻代大小
-XX:MetaspaceSize 设置元空间大小
-XX:+PrintGCDetails 输出GC日志信息
-XX:SurvivorRatio  设置Ende区在新生代中的占比
-XX:NewRatio  设置老年代在堆中的占比
-XX:MaxTenuringThreashold 设置对象的最大年龄

「关于新生代中的Eden和Survivor的占比问题:笔者JDK得出的是6:1,但查看官方文档得出的结论是8:1」

5. 对象的引用类型

5.1 强引用

Java的默认引用类型,所有的对象创建都是强引用,当对象引用变量为null的时候被回收

5.2 软引用

通过SoftReference设置软引用,当内存空间不足的时候,软引用对象被直接回收

5.3 弱引用

通过WeakReference设置若引用,当GC运行的时候,就会将这个类型的对象回收

5.3.1 什么实用实用软引用或者虚引用

本地图片加载的时候,通常我们会将之加载到缓存中。但是当图片数量急剧增加的时候就有可能发生OOM,所以我们可以通过虚引用或者软引用保存图片的对象

例如我们可以构建一个HashMap对象封装URL和图片对象映射,其中的图片对象使用弱引用或者软引用的方式。当内存不足的时候自动回收内存中的图片对象

代码语言:javascript
复制
HashMap<String,SoftReference<Bitmap>> imageCache =
    new HashMap<>();
5.3.2 WeakHashMap

存储一个弱引用的Key,当一个key是无效的时候,该键将被移除

5.4 虚引用

通过PhantomReference设置虚引用,该引用相当于没有引用,通过get方法不能获取引用的值,唯一的作用就是配合ReferenceQueue使用,在gC以后被放入引用队列中,做一些后续操作,比如通知等等。

5.5 引用队列

软引用,弱引用,虚引用被GC以后不会立即消失,而是添加到了ReferenceQueue引用队列中,可以做后续的操作。

「案例演示」

可以看到在GC以后引用队列中有值了

6. OOM

6.1 栈溢出

java.lang.StackOverflowError栈溢出,栈的默认空间大小为512~1024k当超过这个界限以后就会触发这个错误

6.2 堆溢出

java.lang.OutOfMemoryError:Java heap space堆溢出。

「常见的场景:大对象(直接超过老年区大小);强引用对象的不断出现」

6.3 GC超出资源限制

java.lang.OutOfMemoryError:overhead limit exceededGC占据了系统98%的运行,但是仅仅回收了2%不到的内存空间。导致重复GC,但空间没法释放。爆出这个错误

6.4 堆外内存溢出(直接内存溢出)

java.lang.OutOfMemoryError:Direct buffer memory堆外内存溢出,使用NIO的时候会出现

NIO中使用

6.5 不能够再创建本地线程

java.lang.OutOfMemoryError:unable to create new native thread

默认大小为1024个

6.6 元空间溢出

java.lang.OutOfMemoryError:Metaspace

默认大小为20M

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 石的三次方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • JVM参数
    • 1. 标配参数
      • 2. -X参数
        • 3. -XX参数
          • 3.1 Boolean类型
          • 3.2 KV类型
          • 3.3 查看JVM默认参数
        • 4. JVM常用参数
          • 5. 对象的引用类型
            • 5.1 强引用
            • 5.2 软引用
            • 5.3 弱引用
            • 5.4 虚引用
            • 5.5 引用队列
          • 6. OOM
            • 6.1 栈溢出
            • 6.2 堆溢出
            • 6.3 GC超出资源限制
            • 6.4 堆外内存溢出(直接内存溢出)
            • 6.5 不能够再创建本地线程
            • 6.6 元空间溢出
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档