- 发布日期:2023-10-30 07:51 点击次数:172
本文转载自微信公众号「圭臬新视界」,作家丑胖侠二师兄。转载本文请相关圭臬新视界公众号。
弁言如果你从事Java开垦多年,还没用过JVM分析用具,还没尝试着通过对JVM的dump日记来进行故障定位和性能调优,那么不错说是你职场糊口中的一大缺憾,亦然一种智商的缺失。
这篇著作就基于一款JDK自带的用具(VisualVM),然后编写内存溢出的案例,带民众体验一下JVM分析的初学。文中触及到多个学问点的交融与实战造就共享,读者可寄望一下。
VisualVM简介VisualVM是Netbeans的profile子技俩,在JDK6.0 update 7 中自带,大要监控线程,内存情况,检讨措施的CPU时辰和内存中的对象,已被GC的对象,反向检讨分派的堆栈(如100个String对象离别由哪几个对象分派出来的)。
合法赌球平台如果如故正确设置classpath旅途,VisualVM的运行特地绵薄,只需在号令行输入jvisualvm即可运行图形化界面。VisualVM不仅相沿本机监控,还相沿汉典监控。
汉典监控设置略略复杂一些,这里以土产货监控为示例进行演示。至于坐褥环境,可选拔汉典监控,也可伙同jmap先生成dump文献,然后下载dump文献进行分析。
VisualVM功能界面运行VisualVM之后,先来看一下有助于JVM分析的几项功能。这里先以土产货运行的Idea为例来进行展示。
轮廓干涉VisualVM之后,点击左边的对应程度,率先展示的是【轮廓】本体:
轮廓中披露了JVM、Java版块、dump批次等信息,在实战中这里的信息可用来进行信息查对。罕见是JVM参数和系统属性项的查对。
曾遭逢一个场景,便是通过运行Java圭臬时JVM参数的位置写错了,导致JVM参数并不凯旋。
比如如下辅导,由于JVM的参数写在了终末,会导致参数修复无效。
java AG捕鱼-jar app.jar -Xms256m -Xmx512m
而正确的写法应该是如下:
java -Xms256m -Xmx512m -jar app.jar
上头这种情况,通过该用具不错冒昧的看出JVM参数项内部并莫得指定的参数值。
监视监视界面是用的比拟多的一个界面,通过该界面不错检讨CPU使用情况、堆和Metaspace的使用情况、线程的使用情况、类的加载情况等。
通过对堆和Metaspace的使用情况分析,不错看到对应内存空间的使用和增长情况,可进行合理退换和方针。
皇冠客服飞机:@seo3687
点击右上角的“堆 dump”,会基于点击的时辰节点生成dump文献。
选录部分会披露生成dump文献的时辰节点和存储旅途。咱们用来分析内存主如果在此页面中的“类”菜单内。
干涉可检讨在堆中不同实例占用的内存大小。双击类名,即可干涉检讨“实例数”,也便是具体类的实例确定。
而咱们在内存分析时最蹙迫的其实便是“类”的数目。在了解了上述的基本操作之后,咱们就用一个实例来模拟分析一下内存溢出的场景吧。
内存溢出场景构建

先写一段代码,用来模拟内存溢出,也便是创建一个Map,然后向其中束缚的新增对象。同期在圭臬处治的历程中让线程休眠或死轮回来便捷通过VisualVM进行检讨。
事实八卦,相似度低的长句:测试代码如下:
public class MemoryLeakTest { /** * 声明缓存对象 */ private static final Map<String, TestMemory> CACHE_MAP = new HashMap<>(); public static void main(String[] args) { try { //给掀开visualVm时辰 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } //轮回添加对象到缓存 for (int i = 0; i < 1000000; i++) { TestMemory t = new TestMemory(); CACHE_MAP.put("key" + i,皇冠分红 t); } System.out.println("-------1------"); //为dump出堆提供时辰 try { //给掀开visualVm时辰 Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } for(int i=0; i<1000000;i++){ TestMemory t = new TestMemory(); CACHE_MAP.put("key"+i,t); } } }
TestMemory类代表生成中的业务类。
体彩排列三直选号码318历史上出现了10次,其下期分别开出奖号:640、668、102、864、075、810、068、689、531,统计如下表:
足球注册球员条件2、排列三5码组六统计:截止第2023152期,排列三已开出了6573期奖号了,其中组六号码出现了4678次,组三出现了1824次,豹子出现了71次。
public class TestMemory { }
为了让圭臬更快的达到内存的阈值,咱们运行时可规章JVM的大小,这里修复为:
-Xms128m -Xmx128m
另外,为了分析堆的内存结构中每个区域(重生代、老年代)的内存使用情况,可在VisualVM的“用具”、“插件”中装配Visual GC插件。该插件的使用后续会看到落幕。
网站忘记密码找回历史一切准备恰当,底下来进行考证。
内存溢出分析底下咱们就来运行圭臬,运行VisualVM来进行内存溢出的分析。
当圭臬实验的历程中,咱们会发现“堆”内存会出现一个快速增多的弧线。
这个历程中Metaspace也在随之增长。
掀开Visual GC界面,咱们会看到口试中被问过好多遍的堆内存结构:
通过这张图,不错直不雅的看到堆内存中的老年代、重生代、Metaspace空间(JDK8),还有重生代中的Eden、S0(Survivor From)、S1(Survivor To),何况它们的分派比例也有一个比拟直不雅的展示。通过这种神气,是不是不错更直不雅的学习堆内存结构呢?
这里Eden如故被填满、S0和S1为空,老年代也险些被填满(因为垃圾网罗无法断根抓有援用的对象)。
最蹙迫的是你会发现针对老年代在20分钟内进行了3850次垃圾回收。也便是说如故触发了频频的Full GC操作,何况内存并莫得被开释掉。在坐褥系统中,当你看到系统在频频的进行Full GC操作,那是JVM在开释一个很恐怖的信号了。
上头说了一些征象的本体,刻下着实开进行内存分析了。回到上头提到的“监视”、“堆dump”、“类”中,不错看到下图:
不错看到,堆中存在着100万个TestMemory对象。当你看到堆中有相同的精深的对象存在,你应该明白到此处可能有内存浮现。也便是精深的对象被创建,而莫得被“凯旋”回收。咱们这里没被回收的原因是对象被放在了静态变量内部了。
上头如故提到,你还不错进一步双击对象称号,去检讨对象的详备信息。
通过上头设施,基本上不错定位到哪些对象的处治出现了问题,此时再回到代码中针对相应的代码进行排查,便可快速定位内存溢出的问题场地。其中咱们需要罕见寄望上述历程中VisualVM为咱们提供的那些报警信号和数据呈现。
电竞直播皇冠官网 小结本文咱们是在讲VisualVM的使用,亦然在讲线上JVM的排查,亦然在讲JVM的内存结构,照旧在讲怎样去构造一个内存溢出(bug)的场景。但讲什么并不蹙迫,要道是看,通过这篇著作,你重温了什么,学到了什么,又成绩了什么。
皇冠客服系统维护