当前位置:首页 > 内存 > 正文

jvm内存溢出解决方案(jvm内存溢出该如何定位解决)

  • 内存
  • 2024-06-10 05:44:52
  • 6567

一、内存溢出的几种原因和解决办法内存溢出是指应用程序在系统中有不可访问的内存或者使用了过多的内存,最终导致程序运行时使用的内存超过了虚拟机可以提供的最大内存。
加载到内存的数据量太大,比如一次从数据库中取出太多数据,集合类中包含对象的引用,使用后没有清除,导致JVM无法去;回收;代码中有无限循环或循环;使用的第三方软件BUG很小;检查数据库查询中是否有一次性获取所有数据的查询。一般来说,如果一次将10万条记录带入内存,就可能会导致内存溢出。这个问题比较隐蔽。上线之前,数据库包含的数据较少,不太可能出现问题。上线后,数据库中的数据较多,单次查询就可能导致内存溢出。因此,尽量使用分页进行数据库查询。
检查代码是否包含无限循环或递归调用。
二、jvmMetaSpace内存溢出近日,为了方便监控系统的某次呼叫链路情况,测试环境中引入了该公司的skywalking组件。
引入方法也比较简单,就是在jvm参数中添加:
然后我基本上就添加了所有的服务,但是每次添加其中一个服务时,内存就溢出了几秒钟后,转储堆栈就被打印出来了。恢复后就好了
1.拿到堆栈信息后,我先用MAT查看堆信息
查看堆信息后,这是正常的,因为我老90年代的设置是2G,远远没有达到标准。所以继续观察他的gc日志情况。
这里发现了大量的FullGC,而且它们都和Metadata有关,所以Metadata是存储类加载、常量等信息的地方。
应该是skywalking底层使用了字节码技术来创建类,而这个服务启动时,有大量的定时任务触发skywalking创建类。然后这些临时类信息被放置在MetaSpace中。因为它们还没有来得及回收,就被填满了,导致gc被触发,但此时它们仍然被引用。所以最后,MetaSpaceOOM
我们设置了128M,然后我增加到了512M,问题就解决了。同时,对于这种通过反射创建和处理的逻辑,通常需要考虑元空间的溢出。