首页 >> 手游攻略

over flow在线观看免费观看

各位老铁们,大家好,今天由我来为大家分享over flow在线观看免费观看,以及如果在线上遇到了OOM,该如何解决?的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

OOM意味着程序存在着漏洞,可能是代码或者JVM参数配置引起的。这篇文章和读者聊聊,Java进程触发了OOM后如何排查

常说对生产环境保持敬畏之心,快速解决问题也是一种敬畏的表现

为什么会OOM?

OOM全称“OutOfMemory”,表示内存耗尽。当JVM因为没有足够的内存来为对象分配空间,并且垃圾回收器也已经没有空间可回收时,就会抛出这个错误

为什么会出现OOM,一般由这些问题引起

分配过少:JVM初始化内存小,业务使用了大量内存;或者不同JVM区域分配内存不合理代码漏洞:某一个对象被频繁申请,不用了之后却没有被释放,导致内存耗尽

内存泄漏:申请使用完的内存没有释放,导致虚拟机不能再次使用该内存,此时这段内存就泄露了。因为申请者不用了,而又不能被虚拟机分配给别人用

内存溢出:申请的内存超出了JVM能提供的内存大小,此时称之为溢出

内存泄漏持续存在,最后一定会溢出,两者是因果关系

常见的OOM

比较常见的OOM类型有以下几种

java.lang.OutOfMemoryError:PermGenspace

Java7永久代(方法区)溢出,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。每当一个类初次加载的时候,元数据都会存放到永久代

一般出现于大量Class对象或者JSP页面,或者采用CgLib动态代理技术导致

我们可以通过-XX:PermSize和-XX:MaxPermSize修改方法区大小

Java8将永久代变更为元空间,报错:java.lang.OutOfMemoryError:Metadataspace,元空间内存不足默认进行动态扩展

java.lang.StackOverflowError

虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的。如果栈大小设置过小也会出现溢出,可以通过-Xss设置栈的大小

虚拟机抛出栈溢出错误,可以在日志中定位到错误的类、方法

java.lang.OutOfMemoryError:Javaheapspace

Java堆内存溢出,溢出的原因一般由于JVM堆内存设置不合理或者内存泄漏导致

如果是内存泄漏,可以通过工具查看泄漏对象到GCRoots的引用链。掌握了泄漏对象的类型信息以及GCRoots引用链信息,就可以精准地定位出泄漏代码的位置

如果不存在内存泄漏,就是内存中的对象确实都还必须存活着,那就应该检查虚拟机的堆参数(-Xmx与-Xms),查看是否可以将虚拟机的内存调大些

小结:方法区和虚拟机栈的溢出场景不在本篇过多讨论,下面主要讲解常见的Java堆空间的OOM排查思路

查看JVM内存分布

假设我们Java应用PID为15162,输入命令查看JVM内存分布jmap-heap15162

[xxx@xxx~]#jmap-heap15162nAttachingtoprocessID15162,pleasewait...nDebuggerattachedsuccessfully.nServercompilerdetected.nJVMversionis25.161-b12nnusingthread-localobjectallocation.nMarkSweepCompactGCnnHeapConfiguration:nMinHeapFreeRatio=40#最小堆使用比例nMaxHeapFreeRatio=70#最大堆可用比例nMaxHeapSize=482344960(460.0MB)#最大堆空间大小nNewSize=10485760(10.0MB)#新生代分配大小nMaxNewSize=160759808(153.3125MB)#最大新生代可分配大小nOldSize=20971520(20.0MB)#老年代大小nNewRatio=2#新生代比例nSurvivorRatio=8#新生代与Survivor比例nMetaspaceSize=21807104(20.796875MB)#元空间大小nCompressedClassSpaceSize=1073741824(1024.0MB)#CompressedClassSpace空间大小限制nMaxMetaspaceSize=17592186044415MB#最大元空间大小nG1HeapRegionSize=0(0.0MB)#G1单个Region大小nnHeapUsage:#堆使用情况nNewGeneration(Eden+1SurvivorSpace):#新生代ncapacity=9502720(9.0625MB)#新生代总容量nused=4995320(4.763908386230469MB)#新生代已使用nfree=4507400(4.298591613769531MB)#新生代剩余容量n52.56726495150862%used#新生代使用占比nEdenSpace:ncapacity=8454144(8.0625MB)#Eden区总容量nused=4029752(3.8430709838867188MB)#Eden区已使用nfree=4424392(4.219429016113281MB)#Eden区剩余容量n47.665996699370154%used#Eden区使用占比nFromSpace:#其中一个Survivor区的内存分布ncapacity=1048576(1.0MB)nused=965568(0.92083740234375MB)nfree=83008(0.07916259765625MB)n92.083740234375%usednToSpace:#另一个Survivor区的内存分布ncapacity=1048576(1.0MB)nused=0(0.0MB)nfree=1048576(1.0MB)n0.0%usedntenuredgeneration:#老年代ncapacity=20971520(20.0MB)nused=10611384(10.119804382324219MB)nfree=10360136(9.880195617675781MB)n50.599021911621094%usednn10730internedStringsoccupying906232bytes.

通过查看JVM内存分配以及运行时使用情况,可以判断内存分配是否合理

另外,可以在JVM运行时查看最耗费资源的对象,jmap-histo:live15162|more

JVM内存对象列表按照对象所占内存大小排序

instances:实例数bytes:单位byteclassname:类名

明显看到CustomObjTest对象实例以及占用内存过多

可惜的是,方案存在局限性,因为它只能排查对象占用内存过高问题

其中“[”代表数组,例如“[C”代表Char数组,"[B"代表Byte数组。如果数组内存占用过多,我们不知道哪些对象持有它,所以就需要Dump内存进行离线分析

jmap-histo:live执行此命令,JVM会先触发GC,再统计信息

Dump文件分析

Dump文件是Java进程的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等信息

当程序发生内存溢出或GC异常情况时,怀疑JVM发生了内存泄漏,这时我们就可以导出Dump文件分析

JVM启动参数配置添加以下参数

-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./(参数为Dump文件生成路径)

当JVM发生OOM异常自动导出Dump文件,文件名称默认格式:java_pid{pid}.hprof

上面配置是在应用抛出OOM后自动导出Dump,或者可以在JVM运行时导出Dump文件

jmap-dump:file=[文件路径][pid]nn#示例njmap-dump:file=./jvmdump.hprof15162

在本地写一个测试代码,验证下OOM以及分析Dump文件

设置VM参数:-Xms3m-Xmx3m-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=./

publicstaticvoidmain(String[]args){nList<Object>oomList=Lists.newArrayList();nt//无限循环创建对象nwhile(true){noomList.add(newObject());n}n}

通过报错信息得知,javaheapspace表示OOM发生在堆区,并生成了hprof二进制文件在当前文件夹下

JvisualVM分析

Dump分析工具有很多,相对而言JvisualVMJProfilerEclipseMat,使用人群更多一些。下面以JvisualVM举例分析Dump文件

列举两个常用的功能,第一个是能看到触发OOM的线程堆栈,清晰得知程序溢出的原因

第二个就是可以查看JVM内存里保留大小最大的对象,可以自由选择排查个数

点击对象还可以跳转具体的对象引用详情页面

文中Dump文件较为简单,而正式环境出错的原因五花八门,所以不对该Dump文件做深度解析

注意:JvisualVM如果分析大Dump文件,可能会因为内存不足打不开,需要调整默认的内存

总结回顾

线上如遇到JVM内存溢出,可以分以下几步排查

jmap-heap查看是否内存分配过小jmap-histo查看是否有明显的对象分配过多且没有释放情况jmap-dump导出JVM当前内存快照,使用JDK自带或MAT等工具分析快照

如果上面还不能定位问题,那么需要排查应用是否在不断创建资源,比如网络连接或者线程,都可能会导致系统资源耗尽

作者:是龙台呀

原文链接:https://blog.csdn.net/qq_37781649/article/details/120931207

over flow在线观看免费观看和如果在线上遇到了OOM,该如何解决?的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!



本文由欣欣吧手游攻略栏目发布,感谢您对欣欣吧的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“over flow在线观看免费观看

标签:
OVA我的妈妈
« 上一篇 2023-10-17