java jvm性能调优_《Java 底层原理》Jvm性能调优

前言

Java 的性能调优,主要就是为了防止出现out of memory(oom)。Java出现oom就会直接导致程序停止运行。

调优

模拟元空间oom的情况

importnet.sf.cglib.proxy.Enhancer;importnet.sf.cglib.proxy.MethodInterceptor;importnet.sf.cglib.proxy.MethodProxy;importjava.lang.reflect.Method;public classMetaSpaceOverTest {public static void main(String[] args) throwsInterruptedException {while (true){

Thread.sleep(20);

Enhancer enhancer= newEnhancer();

enhancer.setSuperclass(MetaSpaceOverTest.class);

enhancer.setUseCache(false);

enhancer.setCallback(newMethodInterceptor() {

@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throwsThrowable {returnmethodProxy.invoke(o,objects);

}

});

enhancer.create();

}

}

}

需要设置的参数:-XX:+PrintGCDetails -XX:MetaspaceSize=20M -XX:MaxMetaspaceSize=20M      分别是打印GC日志,设置元空间的内存初始值的最大值。

运行结果:

98d335c15db6e59238eee73b7479ce7f.png

Metaspace 空间出现oom的情况,通过jvisualvm 工具可以比较清楚的看到元空间的使用情况。

c2830ce9d9c1509fd7074fbc3589b17f.png

GC日志说明:

[GC (Metadata GC Threshold) [PSYoungGen: 555K->128K(35328K)] 4349K->3922K(105472K), 0.0012436 secs] [Times: user=0.00 sys=0.00, real=0.00secs]

[Full GC (Metadata GC Threshold) [PSYoungGen: 128K->0K(35328K)] [ParOldGen: 3794K->3789K(108544K)] 3922K->3789K(143872K), [Metaspace: 19831K->19831K(1067008K)], 0.0169102 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]

GC (Metadata GC Threshold): 这是一个young GC,表示GC作用的内存位置,Metadata是元空间的意思。

[PSYoungGen: 555K->128K(35328K)] :这是一个youngGC 新生代堆区从555K 变成 128K, 新生代堆区总大小是35328K。

4349K->3922K(105472K) :总堆区从4349K到3922K, 总堆区的大小105472K。

0.0012436 secs:GC消耗的时间。

Full GC (Metadata GC Threshold) : 这是一个Full GC。

[PSYoungGen: 128K->0K(35328K)]:新生代对象占用内存移动到了老年代。

[ParOldGen: 3794K->3789K(108544K)]:老年代堆区从3794K->3789K。

3922K->3789K(143872K):整个堆区的变化情况。

[Metaspace: 19831K->19831K(1067008K)]:元空间的占用内存的变化情况。这里可以看到已经快超20M。

重点:方法区调优,-XX:MetaspaceSize=20M -XX:MaxMetaspaceSize=20M 两个参数设置一样大,程序运行后查询元空间被使用的情况,在这个基础上加20%的。查看元空间的使用情况可以使用工具:jvisualvm

模拟堆区的oom

importjava.util.ArrayList;importjava.util.List;public classHeapOverTest {int[] intArr = new int[50];public static void main(String[] args) throwsInterruptedException {

List heapOverTestList = new ArrayList<>();for(;;){

Thread.sleep(1);

heapOverTestList.add(newHeapOverTest());

}

}

}

-Xmx10m -Xms10m -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:

Jvm 参数设置堆的最大最小内存大小和打印GC日志, 剩下的是用于打印日志和将Heap信息的日志存放到D盘。

运行结果:(运行一段时间会出现这个报错。)

59959e3d8e1bb07b46f5eca257ab2454.png

利用该工具可以很好的看出来堆内存的使用情况。

3289d1314e39d3645f48bcac257dea4a.png

根据前面的信息,我们已经获取到一个HeapOOM的日志,我们来分析看看。

62b07c264709732b9bf47b5ddb47edef.png

上传日志分析,点击类视图,查看什么对象比较占用内存。

988090bcd4d330fa97053a942c9da759.png

可以比较明显的看出什么比较暂用内存。当然生产环境会比这个大很多很多,分析也会更加复杂。

这里的int[] 我们其实还不知道具体是被哪个对象引用,所以我需要查看被引用对象。

bcb3101b4f62d89cd559310c8b62a632.png

然后找到他的引用对象:

c6d0d52de6733eb727e3457f24d2ee70.png

堆区调优:堆区最大值和最小值调整一样大,防止内存抖动,具体调整多大根据程序正常运行下再加30%。

-Xmx10m 设置堆内存的最大值-Xms10m 设置堆内存的最小值

虚拟机栈-OOM

public classStackOverTest {private int val = 0;public voidtest(){

val++;

test();

}public static voidmain(String[] args) {

StackOverTest stackOverTest= newStackOverTest();try{

stackOverTest.test();

}catch(Throwable e) {

System.out.println("栈深度:"+stackOverTest.val);

}

}

}

运行结果:

ba8abedbdc9dfc00da66213ec886193e.png

这个栈深度每次运行会出现略微的差别:原因是因为会出现栈上分配,轻量级锁的存在。

-Xss100K 设置虚拟机栈大小,部分机器最小要求不同

Java Agent

待补充

实战

1. 死锁

e234c7c72ca264d6460c7e9ed1909c07.png

2. CPU消耗高

top -H -p 6290 --6290是进程号

总结

Jvm性能调优是Java工程师的必修课。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503938.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yota3墨水屏设置_汉阳环卫工节前给道路隔音屏“洗澡”

楚天都市报9月27日讯(记者卢成汉 通讯员肖赟 肖利)据了解&#xff0c;三环线汉阳段连接硚口区和经济技术开发区&#xff0c;是货运主通道和入城环路&#xff0c;墨水湖北路二环线延长线高架是二环线汉阳中心城区与三环线的重要连接道&#xff0c;都属“城市快速路”&#xff0c…

java atd_Java字符串String详解

1、String字符串实例化String对象&#xff1a;(1)直接赋值&#xff0c;如&#xff1a;String str"hello";(2)使用关键字 new&#xff0c;如&#xff1a;String strnew String("hello");由图可知&#xff1a;使用 new 的方式在堆内存中开辟了两个空间&#…

while用法_语法宝典:连词while的四种用法,你都学会了吗?

你可能知道while除了表示“当……的时候”&#xff0c;还有它与when, as的用法区别&#xff0c;但是这些还不够全面&#xff0c;今天小编就来给大家详细解析一下相关的用法&#xff0c;一起来看看吧&#xff01;一、考查表示时间的用法&#xff0c;其意为“当……的时候”。如&…

java基础语法试题_java基础语法测试题

java基础语法测试题 Java 程序设计:07-07考试时间&#xff1a;90 分钟用户&#xff1a;wanggang 难度&#xff1a;0 总分&#xff1a;100导出时间&#xff1a;2011-07-07 13:06:15一、判断题(每题 2 分&#xff0c;总分 20 分)1.( )接口和类一样也可以有继承关系&#xff0c;而…

开发转测试没人要_新人如何快速的进入融入软件测试行业?

古人云“师傅领进门&#xff0c;修行在各人”任何行业的入门门槛都是不一样的&#xff0c;软件测试行业涉及到专业领域的知识&#xff0c;入门的门槛高吗&#xff1f;怎么更好的融入行业呢&#xff1f;首先要说到的是软件测试学习的途径主要就三种&#xff0c;一种自学&#xf…

winform checkbox要点击两次_这个Winform的UI库也太全了!四十多个控件都在这一个项目里了...

之前 Gitee 为大家介绍过几款优质的 Winform 项目&#xff1a;这几个WinForm项目&#xff0c;让你更熟悉 .NET&#xff5c;Gitee 项目推荐&#xff0c;发现Winform在大家心中的地位还是挺高的&#xff0c;那么今天就再给各位分享一款新鲜出炉的 Winform UI库——SunnyUI&#x…

苹果ppt_你的PPT太low了,学学苹果吧

人在职场哪能不会PPT&#xff0c;可是辛苦做好的PPT总要换来一句&#xff1a;“好low啊&#xff0c;能不能高大上一点&#xff1f;学学人家苹果员工的工作汇报或者发布会PPT吧&#xff01;”这个时候你心里肯定要吐槽一句&#xff1a;“天&#xff01;我要是PPT能做成苹果风&am…

webservice 服务器无法处理请求_Message Queue与WebService比较

最近在使用IBM Websphere Message Queue,与WebService相比&#xff0c;同样是跨平台的通信方式&#xff0c;那么各种有什么优势呢&#xff1f;Message Queue属于比较重量级的应用&#xff0c;在规范化的企业流程中用的比较多。如果企业有很多部门&#xff0c;部门都有自己的系统…

小程序 字号设置 slider滚动改变大小_SteerMouse for mac(鼠标设置工具) v5.4.3

Steermouse Mac版这是一款Mac鼠标设置工具&#xff0c;不论你的Mac OS鼠标是Magic Mouse这样的额蓝牙鼠标还是我们常用的USB鼠标你都可以轻松设置。steermouse mac版软件介绍SteerMouse是一个实用程序&#xff0c;可让您自由地自定义按钮&#xff0c;滚轮和光标速度。无论鼠标是…

JAVA不同类型数组重载_方法的重载;数组 (Java Day05)

一&#xff0c;方法的重载概念&#xff1a;在一个类中&#xff0c;拥有多个方法名相同&#xff0c;参数列表不同的方法的现象叫做方法的重载特征&#xff1a;​ 1、在同一个类中​ 2、方法名相同​ 3、参数列表不同参数列表的不同&#xff1a…

佳博网络打印机改ip工具_换IP软件为什么是网络工作者首选工具?

科技的不断发展也在促使着网络技术的进步&#xff0c;而网络对于我们日常工作生活来说是不可或缺的&#xff0c;太多事情都需要在网络中完成&#xff0c;对于互联网从业者深知其重要性&#xff0c;常常会因为项目的不同需要切换不同的IP地址来进行工作&#xff0c;一般情况下我…

玩ts要注意什么_番禺三维创意拍摄要注意什么

番禺三维创意拍摄要注意什么 广州思卓传媒有限公司(简称思卓传媒)成立于互联网&#xff0c;视频迅速崛起的21世纪&#xff0c;前身为思卓影视工作室&#xff0c;近十年积累了丰富品牌策划制作&#xff0c;以专注&#xff0c;精益求精的匠人精神为追求&#xff0c;致力于产生专业…

java c 客户端_java基于C/S模式实现聊天程序(客户端)

经过这几天对java的学习&#xff0c;用java做了这个计算机网络的课程设计&#xff0c;基于C/S模式的简单聊天程序&#xff0c;此篇文章介绍一些客户端的一些东西。先讲一讲此聊天程序的基本原理&#xff0c;客户端发送消息至服务器&#xff0c;服务器收到消息之后将其转发给连接…

4接口引脚定义_浅谈USB Type-C接口

笔者前段时间做了一款STM32下载器&#xff0c;为了与新时代接轨&#xff0c;在设计电路板的时候首次使用了USBType-C接口&#xff0c;后来发现其确实很好用。就在今天又设计制作了一款USB-hub&#xff0c;在硬件上我又使用了Type-C接口&#xff0c;所以来了兴致&#xff0c;写一…

rocket mq 监听端口_浅谈业务流程中的mq使用方式

假设有个场景&#xff1a;下单成功需要给用户发送消息通知&#xff0c;发送消息通知通过mq实现事务提交前发送mq消息step1&#xff1a;start transactionstep2&#xff1a;生成订单step3&#xff1a;投递消息到mqstep4&#xff1a;commit transaction问题&#xff1a;step3发生…

jsp工程防止外部注入_XPATH注入详解|OWASP Top 10安全风险实践(五)

本文为一些列连载文章之一&#xff0c;不定期更新&#xff0c;计划目录如下&#xff1a;OWASP介绍SQL注入命令注入XML外部实体注入XPATH注入反射式、DOM及存储XSS失效的身份认证和会话管理不安全的直接对象引用安全配置错误敏感信息泄露功能级访问控制缺失跨站请求伪造服务端请…

小程序反编译 g is not defined_培生幼儿启蒙英语 Level B | 小牧羊女在哪?

本栏目为羽佳讲绘本独家专稿&#xff0c;文中图片及音频已获得海豚传媒授权&#xff0c;未经允许请勿转载。大家好&#xff01;我是毛毛。培生幼儿启蒙英语 Level B(升级版)的分享又来了&#xff01;想了解这套绘本及购买信息的小伙伴们&#xff0c;可以点击喜大普奔&#xff0…

snmp 获得硬件信息_信息系统项目管理师(三)

常规信息系统集成技术系统集成&#xff1a;将计算机软件、硬件、网络通信等技术产品即成为能够满足用户特定需求的信息系统。&#xff08;一&#xff09;网络标准与网络协议1、网络协议网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合。网络协议三要素&…

android 充电动画_iPhone 12充电测试:18/20W并无明显区别

原标题&#xff1a;iPhone 12充电测试&#xff1a;18/20W并无明显区别日前&#xff0c;充电头网使用苹果原装5W、12W、18W、20W以及65W充电器测试了iPhone 12的充电速度。从结果来看&#xff0c;苹果的五福一安的充电数据依旧“稳定”&#xff0c;半小时充入了18%的电量&#x…

跳出所有循环的语句_从零开始的Java之旅2.0 流程控制语句

前言昨天我们对Java的数据类型和运算符进行了充分讲解,今日我们学习流程控制语句. 今日内容:if else 判断语句switch 选择语句for 循环语句while 循环语句do while 循环语句break&#xff0c;continue 跳出语句概述:在一个程序执行的过程中&#xff0c;各条语句的执行顺序对…