2016 - 2024

感恩一路有你

怎样添加jvm启动参数 如何获取JVM的dump文件?

浏览量:4064 时间:2023-04-29 20:23:28 作者:采采

如何获取JVM的dump文件?

资源JVM的dump文件的两种

1.JVM启动时增强两个参数:

#出现OOME时化合堆dump:

-XX:HeapDumpOnOutOfMemoryError

#生成沉淀堆文件地址:

-XX:HeapDumpPath/home/liuke/jvmlogs/

2.才发现程序异常前实际想执行指令,就能生成当前JVM的dmp文件,6214是指JVM的进程号

jmap-dump:formatb,fileserviceDump.dat6214

而第一种是一种之后,要耐心的等待当前JVM直接出现问题后才能生成dmp文件,实时性不高,第二种在执行时,JVM是暂停服务的,所以对线上的运行会产生影响。所以个人建议第一种。

如何正确学会Java虚拟机调优?

一点小经验皆有可能:

1)堆

运行时数据区域,所有类实例和数组的内存均从此处分配。Java虚拟机启动时时创建角色。对象的堆内存由称作垃圾回收器的自动出现内存管理系统回收。

堆由两部分分成:

其中edenfromspacetospace也叫年长代(young),oldspace叫旧生代.

其中有S1,S0(在JDK的从网上下载工具输出中会看见),四个指的是Survivorspace,存放每次来垃圾回收后能够存活的对象.

OldGeneration,比较多存放应用程序中生命周期长的存活对象

垃圾回收要注意是对YoungGeneration块和OldGeneration块内存接受回收,YG用来放新才能产生的对象,当经过几次回收都还没回收掉的对象往OG中移动,

对YG接受垃圾回收又叫做MinorGC,对OG垃圾回收叫MajorGC,几块内存回收井水不犯河水

2)非堆内存

JVM具有一个由所有线程互相访问的方法区。方法区属于非堆内存。它储存每个类结构,如运行时常数池、字段和方法数据,包括方法和构造方法的代码。它是在Java虚拟机启动后时创建角色的。

以外方法区外,Java虚拟机利用肯定是需要主要用于内部处理或优化的内存,这种内存也非堆内存。的或,JIT编译器要内存来存储文件从Java虚拟机代码可以转换而来的本机代码,使额外低性能。

Permanent Generation(图中的PermanentSpace)贮存JVM自己的反射对象,诸如类对象和方法对象

3)回收算法和过程

JVM常规一种分代回收(generationalcollection)的策略,用较高的频率对年长的对象(younggeneration)通过扫描和工厂回收,这种叫作minorcollection,而对老对象(oldgeneration)的检查回收频率要低比较多,一般称ti国际邀请赛collection。那样的话就不必须每次GC都将内存中所有对象都去检查一遍。

当一个URL被ftp连接时,内存申请过程不胜感激:

A.JVM会企图为咨询Java对象在Eden中重新初始化一块内存区域

B.当Eden空间足够时,内存可以申请结束了。不然的话到接下来

C.JVM借着释放出在Eden中所有不亢奋状态的对象(这属于1或更低级的垃圾回收),释放后若Eden空间仍旧绝对无法放进去新对象,则企图将部分Eden中亢奋状态对象放入Survivor区D. Survivor区被利用作为Eden及OLD的中间同样区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被可以保留在Survivor区

E.当OLD区空间够不够时,JVM会在OLD区进行几乎的垃圾收集(0级)

F.几乎垃圾收集后,若Survivor及OLD区依旧难以存放从Eden不能复制进来的部分对象,会造成JVM根本无法在Eden区为新对象创建角色内存区域,则再次出现”out ofmemory错误”

对象衰老的过程

younggeneration的内存,由一块Eden(伊甸园,很好玩)和四块Survivor Space(1.4文档中被称semi-space)构成。新创建家族的对象的内存都分区分配自eden。三块SurvivorSpace总有会一块是空闲的,使用较多copyingcollection的目标空间。Minorcollection的过程应该是将eden和在用survivorspace中的活对象copy到闲时survivorspace中。说白survivor,也就是大部分对象在伊甸园出生后,完全没有活但是三次GC。对象在younggeneration里奇遇了是有次数的minorcollection后,年纪大了,是会被移到oldgeneration中,称为tenuring。(有无仅当survivorspace不足的时候才会将老对象tenuring?目前资料中还没有找到描述)

剩下的内存空间不足会不触发GC,如eden空间够不够了还要进行minorcollection,oldgeneration空间够不够要进行faceitcollection,permanentgeneration空间不继会引发clearGC。

4接下来的这部分回答的是TOMCAT或者其他服务器直接出现万分感谢错误时的分析:

1、简单是:Javaheapspace

请解释:

Heapsize设置里

JVM堆的设置是指java程序运行过程中JVM是可以调配在用的内存空间的设置.JVM在正常启动的时候会自动启动系统设置Heapsize的值,其精灵召唤空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。是可以用来JVM提供的-Xmn-Xms-Xmx等选项可参与设置中。Heapsize的大小是YoungGeneration和TenuredGeneraion之和。

提示:在JVM中如果98%的时间是主要是用于GC且后用的Heapsize不足以2%的时候将抛出此异常信息。

提示:HeapSize的最千万不能将近用些物理内存的80%,象的要将-Xms和-Xmx选项设置为是一样的,而-Xmn为1/4的-Xmx值。

解决方法:

手动启动系统设置Heapsize

如何修改TOMCAT_,在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以内行:

Java代码

setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m

setJAVA_OPTS%JAVA_OPTS%-server-Xms800m-Xmx800m-XX:MaxNewSize256m

或可以修改

在“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以内行:

JAVA_OPTS$JAVA_OPTS -server -Xms800m-Xmx800m-XX:MaxNewSize256m

2、主要是:PermGenspace

原因:

PermGenspace的全称是Permanent Generation space,是指内存的永久保存区域,这块内存比较多是被JVM贮放Class和Meta信息的,Class在被Loader时可能会被弄到PermGenspace中,它和存放类实例(Instance)的Heap区域有所不同,GC(Garbage Collection)不会在主程序运行期对PermGen space参与清理,所以才假如你的应用中有很CLASS的话,就很可能会出现PermGenspace错误,这种错误较常见在web服务器对JSP并且precompile的时候。如果没有你的WEBAPP下都我用大量的第三方jar,其大小将近了jvm设置成的大小(4M)那你都会产生此错误信息了。

解决方法:

1.不自动设置里MaxPermSize大小

可以修改TOMCAT_(Linux下为),在Java代码

“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入200以内行:

setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m

“echoUsingCATALINA_BASE:$CATALINA_BASE”上面加入到以上行:

setJAVA_OPTS%JAVA_OPTS%-server-XX:PermSize128M-XX:MaxPermSize512m

下为:

Java代码

JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m

JAVA_OPTS$JAVA_OPTS-server-XX:PermSize128M-XX:MaxPermSize512m

JVM的默认设置

堆(heap)(NewsGeneration和OldGeneraion之和)的设置

叶绿里分配的内存由-Xms更改,默认是物理内存的1/64但大于1G。

大分配的内存由-Xmx指定你,默认是物理内存的1/4但大于01G。

设置为空余堆内存大于140%时,JVM就会大小改变堆等到-Xmx的大的限制,可以由-XX:MinHeapFreeRatio指定。

设置成空闲区域堆内存大于70%时,JVM会增加堆待到-Xms的最大值限制,可以不由-XX:MaxHeapFreeRatio重新指定。

服务器像是设置-Xms、-Xmx大小关系以尽量的避免在有时候GC后按照堆的大小,因为上面的两个参数真没什么用。

-Xmn设置里younggeneration的heap大小

-XX:MinHeapFreeRatio与-XX:MaxHeapFreeRatio设置闲时内存占总内存的比例范围,这两个参数会影响不大GC的频率和单次GC的耗时。-XX:NewRatio确定young与oldgeneration的比例。Younggeneration空间越大,minorcollection频率越低,可是sillygeneration空间小了,又很有可能倒致faceitcollection频率提高。-XX:NewSize和-XX:MaxNewSize再指定你了younggeneration的缺省大小和最大大小。

非堆内存的设置

默认分配为64M

-XX:PermSize设置中小于分配空间,-XX:MaxPermSize可以设置最大分配空间。好象把这两个数值设为不同,以减少去申请内存空间的时间。

再讲解时和笔记下,JDK下的一些去相关看内存管理工具的使用:

栏里点jvm内存状态:

jstat-gcutilpid100020

发现异常的例子

jstat-gcutilpid100020

S0S1EOPYGC YGCT FGC FGCT GCT

0.000.0099.9982.5153.1124091.205101177250.3937251.598

0.000.0083.4282.5553.1024091.205101187252.6507253.855

0.000.0056.0682.4653.1024101.205101207254.4677255.672

0.000.0032.1182.5553.1024111.205101217256.6737257.877

0.000.0099.9982.5553.1024121.205101237257.0267258.231

0.000.0076.0082.5053.1024121.205101247259.2417260.446

这个数据显示clearGC不稳定不可能发生。

正常了情况的例子

S0S1EOPYGC YGCT FGC FGCT GCT

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

0.000.000.2455.3999.601710.6671339393.364394.031

参数含义:

S0:Heap上的Survivorspace0段已在用空间的百分比

S1:Heap上的Survivorspace1段已不使用空间的百分比

E:Heap上的Eden space段已不使用空间的百分比

O:Heap上的Old space段已可以使用空间的百分比

P:Permspace已不使用空间的百分比

YGC:从程序启动到采样时发生了什么YoungGC的次数

YGCT:YoungGC所是用时间(单位秒)

FGC:从程序启动到采样时发生了什么endlessGC的次数

FGCT:clearGC所带的时间(单位秒)

GCT:作用于垃圾回收的总时间(单位秒)

2Dump出内存

2.1找出要dump的线程pid

在Linux下,在用ps–aux

2.2Dump出内存使用详情

也可以命令:

jmap-dump:filea.hprofpid

例如:jmap-heap2343,可以清晰的看到

AttachingtoprocessID2343,pleasewait...

Debuggerattachedsuccessfully.

Servercompilerdetected.

JVMversionisn't11.0-b16

usingthread-localobjectallocation.

ParallelGCwith8thread(s)

HeapConfiguration:

MinHeapFreeRatio40

MaxHeapFreeRatio 70 MaxHeapSize 4294967296 (4096.0MB)

NewSize2686976(2.5625MB)

MaxNewSize-65536(-0.0625MB)

OldSize5439488(5.1875MB)

NewRatio2(YG,OG大小比为1:2)

SurvivorRatio8

PermSize21757952(20.75MB)

MaxPermSize 268435456 (256.0MB)

HeapUsage:

PSYoungGeneration

EdenSpace:

capacity1260060672(1201.6875MB)

needed64868288(61.86322021484375MB)

fun1195192384(1139.8242797851562MB)

5.148028935546367%employed

aroundSpace:

capacity85524480(81.5625MB)

used59457648(56.70323181152344MB)

free26066832(24.859268188476562MB)

69.52120375359195%needed

didSpace: capacity 85852160 (81.875MB)

needed0(0.0MB)

cool85852160(81.875MB)

0.0%utilized

~~~~~~~~~~~~~~~~~~~~~~~~~~这三块为上面所说的YG大小和建议使用情况

PS Old Generation capacity 2291138560 (2185.0MB)

used1747845928(1666.8757705688477MB)

fit543292632(518.1242294311523MB)

76.28722062099989%utilized

~~~~~~~~~~~~~~~~~~~~~~~~~~OG大小和不使用情况

PS Perm Generation capacity 108265472 (103.25MB)

needed107650712(102.6637191772461MB)

go614760(0.5862808227539062MB)

99.43217353728436%needed

jstat

jstat是vm的状态监控工具,监控的内容有类加载、运行程序时代码编译及GC。

使用时,需另外查看进程的进程id,和所选参数。以下具体点能介绍各个参数的意义。

jstat-classpid:会显示运行程序class的数量,及所占空间等信息。

jstat-compilerpid:不显示VM实时编译的数量等信息。

jstat-gcpid:是可以会显示gc的信息,打开系统gc的次数,及时间。其中结果五项,三个是younggc的次数,younggc的时间,cleargc的次数,endlessgc的时间,gc的总时间。

jstat-gccapacity:可以没显示,VM内存中三代(young,old,perm)对象的使用和电脑资源大小,如:PGCMN不显示的是最大值perm的内存在用量,PGCMX没显示的是perm的内存最大不使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的是可以参照这个以此类推,OC是old内纯的占用量。

jstat-gcnewpid:next对象的信息。

jstat-gcnewcapacitypid:future对象的信息及电脑资源量。

jstat-gcoldpid:old对象的信息。

jstat-gcoldcapacitypid:old对象的信息非盈利组织会计占用量。

jstat-gcpermcapacitypid:perm对象的信息非盈利组织会计电脑资源量。

jstat-utilpid:统计gc信息统计。

jstat-printcompilationpid:当前VM负责执行的信息。

除此之外以上一个参数外,还也可以同样的而且两个数字,如:jstat-printcompilation30242506是每250毫秒不打印四次,最少打印6次,还可以另外-h3每三行会显示一下标题。

例子:

jstat-gcutilpid100020

S0S1EOPYGC YGCT FGC FGCT GCT

47.490.0064.8246.0847.69208222058.6316822.7342081.365

0.0037.9138.5746.1347.69208232058.6916822.7342081.425这里突然发生了两次YGGC,也就是MinorGC,前后历时0.06s

46.690.0015.1946.1847.69208242058.7766822.7342081.510

46.690.0074.5946.1847.69208242058.7766822.7342081.510

0.0040.2919.9546.2447.69208252058.8486822.7342081.582

MajorGC来算时间:22.734/680.334秒

MinorGC来算时间:2058.691/208230.099秒

内存 对象 JVM 大小 空间

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。