从品牌网站建设到网络营销策划,从策略到执行的一站式服务
这篇文章将为大家详细讲解有关Java内存溢出的原因,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
网站建设哪家好,找创新互联建站!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了鄂托克前免费建站欢迎大家使用!
在Java虚拟机内存区域中,除了程序计数器外,其他几个内存区域都可能会发生OutOfMemoryError,这次通过一些代码来验证虚拟机各个内存区域存储的内容。
在实际工作中遇到内存溢出异常时,需要做到能根据异常信息快速判断是哪个内存区域的溢出,知道什么样的代码会导致这些区域内存溢出,并且知道出现内存溢出后如何处理。
Java堆用于存储对象实例,只要不断的扩展对象,并且保证GCRoots到对象有可达路径来避免垃圾回收,那么对象数量到达堆的最大容量后就会发生内存溢出异常。
以下代码会把堆大小限制在20M且不可扩展(将最小参数-Xms和最大参数-Xmx设为相同就会避免自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在发生内存溢出时Dump出内存快照用来分析。
可以从异常信息中看到,OOM异常发生在“main”线程,发生的内存区域是“Javaheapspace”。
通过IntelliJIDEA运行的话,可以点击EditConfigurations配置VM参数,生成的堆Dump快照文件为hprof后缀,存放在Workingdirectory配置对应的目录下。
要分析Java堆的内存溢出,首先通过快照分析工具(如JavaVisualVM)对Dump出来的的快照进行分析,确认内存中的对象是否是必要的。如果是不必要的而没有垃圾回收掉,则发生的是内存泄漏(MemoryLeak);如果都是必要的,则是内存溢出(MemoryOverflow)。
如果是内存泄漏,通过工具进一步查看对象实例到GCRoots的引用链,找到泄露对象是通过什么路径与GCRoots相关联导致垃圾收集器无法回收它们。根据泄露对象的类型信息和到GCRoots的引用链,就可以定位到泄露代码的位置。
如果是内存溢出,也就是说这些对象还都必须存活,那么就检查堆内存的大小参数(-Xms与-Xmx)与物理内存比较还是否可以调大,再从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。
打开JDK自带的分析工具JavaVisualVM(bin目录下的jvisualvm.exe),点击文件->装入选择堆快照java_pid1344.hprof文件,打开后显示的是概述信息,这里会显示快照的一些基本信息、环境属性以及线程信息。
关于“Java内存溢出的原因”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220
成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有.
专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图