当前位置: 首页 > news >正文

南通网站建设外包/seo团队

南通网站建设外包,seo团队,西安最好的网站建设公司,门户网站开发申请前言:模拟实战中排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)的问题。堆内存溢出的原因:一般都是创建了大量的对象,这些对象一直被引用着,无法被GC垃圾回收掉,最终导致堆内存被占满,没有足…

前言:

模拟实战中排查堆内存溢出(java.lang.OutOfMemoryError: Java heap space)的问题。

堆内存溢出的原因:一般都是创建了大量的对象,这些对象一直被引用着,无法被GC垃圾回收掉,最终导致堆内存被占满,没有足够的空间存放新创建的对象时,就会出现堆内存溢出问题。

在实际的业务场景中出现内存溢出的问题,排查起来一般是十分困难繁琐的,本文将通过结合一个简单的实例来阐述排查的具体思路和步骤。

准备:

注意:在实际场景中,一般都是部署在Linux服务器中的项目报出内存溢出的问题;为了尽可能还原出实际场景,本文也是将提前编写好的可以触发内存溢出的代码并打包成可运行的Jar包,然后放到服务器中执行的。

1、准备可导致内存溢出的代码:

// 创建一个Java类

public class OutOfMemory{

private String test;

public OutOfMemory(String test){

this.test = test;

}

}

// 模拟内存溢出的发生

public class TestOOM{

public static void main(String[] args){

List list = new ArrayList();

while(true){

/**

* 无限创建OutOfMemory对象,直至将堆空间占满,并且创建的OutOfMemory对象一直被list集合对象引用着,

* 导致GC也无法回收,最终出现堆内存溢出问题

*/

list.add(new OutOfMemory("5656"));

System.out.println("5656");

}

}

}

代码编写完成后,使用开发工具导出可运行的Jar包— (TestOOM.jar)

2、准备Linux服务器

可以直接使用centos或者Red Hat等都可以;

实战:

1、将可运行的Jar包放到服务器中执行:

①、可使用xshell、xftp工具将可运行的Jar包(Jar包叫:TestOOM.jar)放入到服务器中;

②、使用命令执行Jar包;命令:

java -Xms40m -Xmx70m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/tmp -jar TestOOM.jar

注意:为了尽快模拟发生堆内存溢出,所以在启动Jar包时,设置了一些参数;参数解析:

1)、 -Xms40m 初始堆大小设置为40m

2)、 -Xmx70m 最大堆大小设置为70m

3)、 -XX:+HeapDumpOnOutOfMemoryError

出现堆内存溢出时,自动导出堆内存 dump 快照

4)、 -XX:HeapDumpPath=/usr/tmp 设置导出的堆内存快照的存放地址为 /usr/tmp

2、执行成功后,使用JVM监控命令监控JVM的信息:

①、jps命令:此命令是用来查询与Java相关的进程的,并输出进程号;下图就是展示上面运行的Jar包的进程号:

490015951beddc5a6b2c5b766384037a.png

②、jmap命令:jmap -heap 3324  此命令是查询出进程号为 3324 的JVM中堆内存信息;如下图:

2d1e1dd5811696a88f20fde7d5fd1077.png

在图中可以发现堆内存中新生代、年老代中 free 可用空间越来越小,这预示着即将会发生GC垃圾回收,从而使堆腾出更多的空间存放新创建的对象。

③、jstat命令:使用其监控JVM的性能信息;例如:在本次排查内存溢出的问题中,会使用 jstat 命令监控 JVM的 GC垃圾回收的情况;

命令:jstat -gcutil 3324 1000   意思是每1000毫秒查询一次进程号为3324 的JVM的GC垃圾回收的情况;如下图:

8953c6a0363a731507e93b337c57c15e.png

(1)、 YGC(堆中新生代GC)、FGC( FULL GC)为什么触发频率这么快呢?

答:由于堆内存空间不够用了,需要通过GC垃圾回收将一些空间进行回收,用于存放新创建的对象。

( 2)、当堆内存空间不够用时,GC具体会发生什么呢?

答:

1)、当堆中的新生代空间不够用时,会触发YGC,对堆中新生代空间进行垃圾回收,同时垃圾回收后剩余存活的对象会移动到堆中老年代存储,所以每次YGC后,堆中年老代中存储的对象数量会增大;

2)、当堆的新生代即将发生YGC时,如果发现新生代中存活下来的对象比堆中年老代中剩余的可用空间大的话,就会直接不进行YGC,而会直接触发FGC,FULLGC会对整个堆空间(新生代、老年代)GC会对整个堆空间(新生代、老年代)以及方法区/永久代进行垃圾回收;

扩展:堆的结构图

65ca54342e42d2bea6656c44f057479a.png

3、出现内存溢出后,会自动生成快照,然后分析堆内存快照:

①、使用XFTP等工具将服务器中的快照文件导出,堆内存快照文件是以hprof为后缀的文件;导出快照文件后,可以通过JDK自带的jvisualvm.exe分析工具打开进行分析。

jvisualvm.exe 是在哪里呢?(以 windows 系统为例)

它是在JDK的安装目录中的bin目录下的。

如图:

1f6fec6129fe34024fbb5f7631bbe126.png

②、使用 jvisualvm.exe 导入快照文件,如图:

(1)、

9c54ea370846b9f89d625ed0d9d1d933.png

(2)、

07efd9c435cefe14aed3604aca5cb3e5.png

(3)、

0a092a7e8d4c4a6dff1206dd7b15c7b5.png

通过分析堆内存快照得到的结论:

通过第(3)张图,可以发现堆内存中有一个实例对象的占比为 99.9%,可以确定是由于这个实例对象大量创建导致堆内存的溢出;

说到这,可以回过头去看下我们自己编写的可以触发堆内存溢出的小程序,发现正是由于在 while(true)死循环 中无线创建 OutOfMemory对象,导致堆内存空间被耗尽。

结语:

通过上面的实战小例子,我们可以大体了解到在出现堆内存溢出时的排查步骤,但是在实际的场景中,这种情况可能会更加的复杂多变;

比如说,上面的那个小例子在出现的堆内存溢出时自动生成的堆内存快照文件大小就达到了100多m,如果在实际的场景中,这个可能是非常巨大的,这时可能就会发生快照分析工具无法导入堆内存快照。所以说,我们需要在平时通过不断的学习,才能在未来出现问题时,能尽快定位问题并解决问题;程序员不光是能编写好代码,还需要有解决问题的能力。

❤不要忘记留下你学习的足迹 [点赞 + 收藏 + 评论]嘿嘿ヾ

一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=

http://www.lbrq.cn/news/1585567.html

相关文章:

  • 网上做效果图网站有哪些软件有哪些/免费推广网站2023mmm
  • 建设学校网站的报告/杭州百度优化
  • wordpress 添加评论/厦门seo测试
  • 建设赌博网站/免费卖货平台
  • 广州市物联网应用示范项目/武汉网站优化公司
  • php网站开发案例教程 dvd/免费的网页入口
  • 天津企业网站制作/百度推广的费用
  • 企业网站设计北京/百度seo怎么做
  • 陕西城乡建设厅网站/各种资源都有的搜索引擎
  • 国内b2c网站建设/每日国际新闻最新消息
  • 做网站服务公司/百度登录个人中心官网
  • 校园网站建设初探论文/辅导班培训机构
  • 网站的购物车怎么做/seo关键词词库
  • 车载互联系统网站建设/seo搜索引擎优化实战
  • 做自媒体你不得不知道的视频网站/怎样在网上做宣传
  • 遵义晚报电子版官方网站/头条站长平台
  • 产品设计网站制作/全网关键词云在哪里看
  • 探马scrm/seo就是搜索引擎广告
  • 手机网站的尺寸做多大的/宁波建站模板系统
  • 开发公司是什么意思/优化网站服务
  • 经营性网站放宽备案条件/友情链接作用
  • 网站建设ktv/html网页制作动态效果
  • 衡水做网站公司/网络营销的认识
  • 开网站赚钱吗/净水器十大品牌
  • 站建设培训学校/2022最近比较火的营销事件
  • 做百度色情网站排名赚钱吗/uc信息流广告投放
  • 找别人做网站需要什么信息/关键词搜索工具app
  • 建设网站详细流程图/网站备案
  • 桓台网站推广/网站seo设计
  • 辽源网站建设/列举常见的网络营销工具
  • Effective C++ 条款30:透彻了解inlining的里里外外
  • Numpy科学计算与数据分析:Numpy数组操作入门:合并、分割与重塑
  • 翻译模型(TM):基于短语的统计翻译模型(PBSMT)的构建
  • npm 与 npx 区别详解。以及mcp中npx加载原理。
  • Linux基础测试
  • 人工智能的20大应用