2016 - 2024

感恩一路有你

在java中如何使用策略模式 如何正确学会Java虚拟机调优?

浏览量:4676 时间:2023-06-05 18:46:56 作者:采采

如何正确学会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)的检查回收频率要低比较多,被称lionscollection。这样的话就不必须每次来GC都将内存中所有对象都全面检查一遍。

当一个URL被访问网络时,内存申请过程如下:

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中的活对象内容复制到空闲survivorspace中。说白survivor,也就是大部分对象在伊甸园蛇宝宝后,根本不会活但是两次GC。对象在younggeneration里有过了一定次数的minorcollection后,年纪大了,是会被移到oldgeneration中,称作tenuring。(有无仅当survivorspace不足的时候才会将老对象tenuring?目前资料中是没有可以找到请看)

剩下的内存空间不足会触发时GC,如eden空间太少了现在就要通过minorcollection,oldgeneration空间太少要接受ti国际邀请赛collection,permanentgeneration空间下降会影响到largeGC。

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”上面加入以上行:

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”上面组建以上行:

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但大于11G。

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

默认空余堆内存大于140%时,JVM变会速度变大堆等他-Xmx的大限制,可以由-XX:MinHeapFreeRatio重新指定。

设置成空余堆内存大于170%时,JVM会下降堆等他-Xms的最大值限制,可以不由-XX:MaxHeapFreeRatio重新指定。

服务器就像设置中-Xms、-Xmx成比例以尽量减少在每次来GC后决定堆的大小,所以才上面的两个参数真没什么用。

-Xmn设置younggeneration的heap大小

-XX:MinHeapFreeRatio与-XX:MaxHeapFreeRatio设置空来内存占总内存的比例范围,这两个参数会影响GC的频率和单次GC的耗时。-XX:NewRatio做出决定young与oldgeneration的比例。Younggeneration空间越大,minorcollection频率越低,可是oldgeneration空间小了,又很可能造成守望先锋挑战者系列赛collection频率减少。-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

这个数据显示wideGC正常再一次发生。

正常了情况的例子

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:从程序启动到采样时发生fullGC的次数

FGCT:largeGC所是用时间(单位秒)

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

2Dump出内存

2.1得出答案要dump的线程pid

在Linux下,建议使用ps–aux

2.2Dump出内存建议使用详情

是可以通过命令:

jmap-dump:filea.hprofpid

比如:jmap-heap2343,可以看见

AttachingtoprocessID2343,can'twait...

Debuggerattachedsuccessfully.

Servercompilerdetected.

JVMversionnot11.0-b16

usingthread-localobjectallocation.

ParallelGCwith8thread(s)

HeapConfiguration:

MinHeapFreeRatio40

MaxHeapFreeRatio70

MaxHeapSize4294967296(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)

used64868288(61.86322021484375MB)

go1195192384(1139.8242797851562MB)

5.148028935546367%needed

outsideSpace: capacity 85524480 (81.5625MB)

employed59457648(56.70323181152344MB)

go26066832(24.859268188476562MB)

69.52120375359195%utilized

wantSpace:

capacity85852160(81.875MB)

needed0(0.0MB)

cool85852160(81.875MB)

0.0%utilized

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

PS Old Generation capacity 2291138560 (2185.0MB)

needed1747845928(1666.8757705688477MB)

cool543292632(518.1242294311523MB)

76.28722062099989%utilized

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

PS Perm Generation capacity 108265472 (103.25MB)

commonly107650712(102.6637191772461MB)

cool614760(0.5862808227539062MB)

99.43217353728436%employed

jstat

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

使用时,需加上一栏进程的进程id,和所选参数。以下祥细介绍各个参数的意义。

jstat-classpid:显示加载class的数量,及所占空间等信息。

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

jstat-gcpid:这个可以会显示gc的信息,栏里点gc的次数,及时间。其中之后五项,各是younggc的次数,younggc的时间,largegc的次数,largegc的时间,gc的总时间。

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

jstat-gcnewpid:future对象的信息。

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

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秒

powerjob优缺点?

PowerJob特点:

可以使用简单啊:提供前端Web界面,不能开发者可视化地成功调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志打开系统等功能。

设置定时策略系统完善:支持什么CRON表达式、且固定频率、单独计算网络延迟和API四种按时调度策略。

负责执行模式相当丰富:允许单机、广播、Map、MapReduce四种负责执行模式,其中Map/MapReduce处理器能使开发者聊聊无几数行代码便我得到集群分布式计算的能力。

DAG工作流支持什么:意见免费配置任务依赖性太强关系,可视化得对任务通过编排,同样还意见上下游任务间的数据传递

执行器接受广泛的:意见Spring Bean、内置/外置Java类、Shell、Python等处理器,应用范围广。

运维快捷便利:意见网日志功能,执行器有一种的日志也可以在前端控制台页面实时显示,减低debug成本,极高地提高开发效率。

感情依赖系统精简:大于仅依赖感关系型数据库(MySQL/Oracle/MSSQLServer...),扩大依赖感为MongoDB(主要用于存储文件庞大无比的在线日志)。

高可用高性能:调度服务器当经过精心设计,一改其他调度框架实现数据库锁的策略,实现程序了无锁化调度。布署多个指挥调度服务器也可以同样实现高可用和性能的提升(接受无穷的的水平存储)。

故障撤回与可以恢复:任务执行失败后,可据配置的重试策略成功请重试,只要你执行器集群有起码的计算节点,任务就能顺利能够完成。

内存 对象 空间 大小 XX

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