虚拟机研究系列-了解虚拟机参数基础

JVM参数简介

-XX参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。如果此类参数设置合理将大大提高JVM 的性能及稳定性。

例如:-XX:+PrintGCDetail,-XX:+ParallelGC

不稳定参数语法规则

布尔类型参数值

-XX:+ '+'表示启用该选项
-XX:- '-'表示关闭该选项

数字类型参数值:

-XX:= 给选项设置一个数字类型值,可跟随单位,

例如:'m’或’M’表示兆字节;'k’或’K’千字节;'g’或’G’千兆字节。32K与32768是相同大小的。-XX:MaxMetaspaceSize=1000m、-XX:newRadio=3

字符串类型参数值

-XX:= 给选项设置一个字符串类型值,通常用于指定一个文件、路径或一系列命令列表。

例如:-XX:HeapDumpPath=./dump.core

FullGC出现前后打印日志

当出现了FullGC的时候,最需要我们注意的就是如何在指定的时间点,进行生产对应的heap dump文件以及对应的当前的快照信息。

JVM参数实现在Full GC前后自动生成Dump。共有三个VM参数需要设置:

1.HeapDumpBeforeFullGC 实现在Full GC前dump。
2.
HeapDumpAfterFullGC 实现在Full GC后dump。
3.
HeapDumpPath
设置Dump保存的路径

设置这些参数的方法,这里总结了四种,大家可以根据情况选择使用。

方法1

启动jvm时,带上这些参数(这个方法适合开发测试环境)

Java -Xms200m -Xmx200m -Xmn50m -XX:PermSize=30m -XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC -XX:HeapDumpPath=e:\dump -jar xxx.jar

方法2

使用JConsole等工具调用JMX服务的com.sum.management.HotSpotDiagnostic.setVMOption方法来实现。

  • 第一个参数为HeapDumpBeforeFullGC, 第二个参数为true表示在Full GC前进行dump.

  • 第一个参数为HeapDumpAfterFullGC, 第二个参数为true表示在Full GC前进行dump.

方法3

使用 **jinfo **命令进行设置。(生产环境常用的方法)

调用jinfo命令设置VM参数

# jinfo -flag +HeapDumpBeforeFullGC 5940

# jinfo -flag +HeapDumpAfterFullGC 5940

方法4

开发程序调用JMX的API来实现,得到了Full GC前后的dump, 接下来就可以使用一些分析工具(如MAT)来分析Full GC产生的原因了

Java堆溢出

堆是用来存储对象的,如果创建了大量的对象且这些对象得不到及时的回收就会造成内存占满,抛出OOM(GC回收时间超过阈值的百分之98% 并且回收的内存不到2%)

怎么解决

设置JVM参数,Dump出当前的内存堆转储快照

解决办法见思路


虚拟机栈和本地方法栈溢出

对单个线程来说:HotSpot将两个栈合二为一,栈里面存储的是栈帧,只有当栈帧不断压入栈(函数递归)就会栈溢出,此时栈深度过深:StackOverflowError。或者一个方法的变量太多导致栈帧内存太大,是的栈的内存不足,很快溢出OutOfMemoryError。

内存溢出:就是栈所占用内存和数量太多了,同时也侧面看出来创建的线程数量太多了,导致OOM。

解决办法

单线程来说:避免栈溢出

1. 找到递归函数,减少递归次数
2. 减少函数本地变量个数以及大小,相应的缩小栈帧的大小
3. 通过-Xss命令来扩大栈内存容量

多线程造成的OOM

1. 减少线程创建数量,优先使用线程池
2. 如果是在不能减少线程,可以适当的减少虚拟机栈的内存来增加可容纳的线程数


方法区和运行时常量池溢出

方法区存放的是类信息和运行时常量池

如果创建大量的类

(因为类的回收要求比较严格,所以一旦创建大量的类,得不到及时回收就会内存溢出)在项目中使用动态代理CGlib技术会生成大量的类,很多动态语言都是这么实现的,因为类加载机制,不同的加载器加载出的同一个类,JVM会认为不同且都保留。

如果创建大量的常量且放入常量池

String类中的intern()方法就是一个Native方法,它的作用是:如果字符串常量池中已经包含一个String对象的字符串(地址),则返回代表池中这个字符串的String对象地址;否则,将此String对象包含的字符串添加到heap堆中,并且返回此字符串常量池的String对象的引用。

直接内存溢出

DirectMemory容量可以通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆最大值(-Xmx指定)一样。

虽然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它是并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配,手动抛出的内存异常。


-XX:MaxDirectoryMemorySize
-XX:MaxMetaSpaceSize
-XX:NewSpaceSize/-Xmx
-Xss
-XX:+HeapDumpOnOutOfMemoryError

在运行的时候设置JVM参数,使其Dump出内存异常信息

-XX:+HeapDumpOnOutOfMemoryError,当出现OOM异常的时候,我们就可以看到一场JVM打印的异常信息

通过内存映像分析工具(Eclipse Memory Analyzer)对Dump出来的内存转储快照进行分析

内存泄漏(Memory Leak)
内存溢出(Memory Overflow)

确定是哪种情况之后

如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链,看看对象时通过怎样的路径与GC Roots相关联导致垃圾收集器无法自动回收他们,掌握了泄露对象的类型信息以及GC Roots引用链信息,就可以比较准确的定位泄漏的位置。

如果不存在泄漏,就说明这些对象都是应该存活的,但是内存不够大。这时候就需要调整堆内存的大小,对比机器物理内存看看堆内存能否相应的调大一点,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容