ElasticSearch服务Java内存异常分析和排查解决

1.ElasticSearch业务微服务日志排查
java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STOPPED
现象:
部署到测试环境之后,用户量大了之后接口报错,报错信息为:Request cannot be executed; I/O reactor status: STOPPED
后端程序处于假死状态,访问其他接口一直转圈,无法响应内容,重启程序之后一切正常,用户量大了之后又有此问题。
测试方法:
使用JMETER设置50个线程并发访问可以稳定复现此问题。压力测试

2.业务系统搜索,关键字: OutOfMemoryError
cat myProject-2024-05-09-3.log | grep "OutOfMemoryError"
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: GC overhead limit exceeded
Consumer thread error, thread abort.java.lang.OutOfMemoryError: GC overhead limit exceeded
这个报错出现时,往往是因为JVM中的GC(Garbage Collection,垃圾回收)过于频繁,以至于大部分的CPU时间都在做GC操作,而无法正常执行程序,这时,就会抛出这个错误。
具体来说,如果超过98%的CPU时间被用来做GC,并且GC后可用的堆内存不足2%,那么将会抛出"java.lang.OutOfMemoryError: GC overhead limit exceeded"错误。

以上日志分析排查的方向转为:
后来发现就是因为OOM导致程序宕机,进而引发连接终止。 排查日志也找到了oom报错日志。

推断:
程序接口中将一块很大的数据存进JAVA集合中引发了oom,oom异常导致程序宕机,处于假死状态,进而导致ES-CLIENT和ES-SERVER端的http连接异常终止,然后org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase.ensureRunning方法报异常。
SpringDataElasticsearch和ES-SERVER是长链接,只要报了OOM,当前和ES-SERVER的连接线程都将报异常,也就是说,虽然OOM只报了一次,但是可能有多个线程都在Asserts.check方法中报异常。

3.查看进程等,确定gc,heapDump.bin文件目录路径,查看xmx配置大小
ps aux --sort -rss | head

链接:ps top命令查看内存空间
https://www.cnblogs.com/oktokeep/p/16361896.html

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 21722 14.6 4.5 11410052 1502980 ? Sl 16:51 5:47 /usr/local/java/bin/java -Djava.util.logging.config.file=/usr/local/myProject/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dfastjson.parser.safeMode=true -server -Xms512m -Xmx1g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/usr/local/myProject/logs/gc-20240509_165141.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/myProject/logs/heapdump.bin -XX:+CMSParallelRemarkEnabled -XX:+ScavengeBeforeFullGC -XX:CMSInitiatingOccupancyFraction=75 -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/myProject/bin/bootstrap.jar:/usr/local/myProject/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/myProject -Dcatalina.home=/usr/local/myProject -Djava.io.tmpdir=/usr/local/myProject/temp org.apache.catalina.startup.Bootstrap start

4.找到tomcat服务里面的gc日志,确定问题,oom报错日志

Java HotSpot(TM) 64-Bit Server VM (25.171-b11) for linux-amd64 JRE (1.8.0_171-b11), built on Mar 28 2018 17:07:08 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8)
Memory: 4k page, physical 32778396k(694320k free), swap 0k(0k free)
CommandLine flags: -XX:CMSInitiatingOccupancyFraction=75 -XX:+CMSParallelRemarkEnabled -XX:CompressedClassSpaceSize=528482304 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/myProject/logs/heapdump.bin -XX:InitialHeapSize=536870912 -XX:MaxHeapSize=1073741824 -XX:MaxMetaspaceSize=536870912 -XX:MetaspaceSize=268435456 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+ScavengeBeforeFullGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC
Heap
PSYoungGen total 153088K, used 21054K [0x00000000eab00000, 0x00000000f5580000, 0x0000000100000000)
eden space 131584K, 16% used [0x00000000eab00000,0x00000000ebf8f870,0x00000000f2b80000)
from space 21504K, 0% used [0x00000000f4080000,0x00000000f4080000,0x00000000f5580000)
to space 21504K, 0% used [0x00000000f2b80000,0x00000000f2b80000,0x00000000f4080000)
ParOldGen total 349696K, used 0K [0x00000000c0000000, 0x00000000d5580000, 0x00000000eab00000)
object space 349696K, 0% used [0x00000000c0000000,0x00000000c0000000,0x00000000d5580000)
Metaspace used 5422K, capacity 5552K, committed 5888K, reserved 1056768K
class space used 608K, capacity 664K, committed 768K, reserved 1048576K

5.解决思路:
1.增大堆空间:Java的堆空间是用来存储对象实例的,如果堆空间不足,那么GC就需要更频繁的运行以回收内存空间,进而造成上述的错误。因此,增大堆空间可以有效减轻GC的压力,从而避免这个错误。
-Xms512m -Xmx1g >> 扩大内存空间 -Xmx2g
2.优化代码:另一个可能的解决思路是优化你的代码,减少对象实例的创建,或者及时地释放不再使用的对象实例,减少GC的工作量。
推荐使用MemoryAnalyzer工具分析溢出代码,于是官网下载,下载地址为:https://www.eclipse.org/downloads/download.php?file=/mat/1.11.0/rcp/MemoryAnalyzer-1.11.0.20201202-win32.win32.x86_64.zip

解决内存溢出,确定gc,heapDump.bin文件目录路径
-XX:+PrintGCDateStamps -Xloggc:/usr/local/myProject/logs/gc-20240509_165141.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/myProject/logs/heapdump.bin


6.Java优化代码片段示例:

SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//数据转换方法
OrderVO<?> result = transform(reqVO, result(searchResponse.getHits().getHits()), searchResponse);
//设置为null 关键 java 大对象快速回收
searchResponse = null; protected List<OrderInfoVO> result(SearchHit[] searchHits) {
List<OrderInfoVO> orderInfoContent = new ArrayList<>();
Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) ->
LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss")))
.registerTypeAdapter(LocalDate.class, (JsonDeserializer<LocalDate>) (json, type, jsonDeserializationContext) ->
LocalDate.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd"))).create();
for (SearchHit hit : searchHits) {
String sourceAsString = hit.getSourceAsString();
OrderInfoVO vo = gson.fromJson(sourceAsString, OrderInfoVO.class);
orderInfoContent.add(vo);
//设置为null 关键 java 大对象快速回收
hit = null;
}
return orderInfoContent;
}

ElasticSearch服务Java内存异常分析和排查解决的更多相关文章

  1. Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析

    原文地址:http://www.javatang.com 一个典型的thread dump文件主要由一下几个部分组成: 上图将JVM上的线程堆栈信息和线程信息做了详细的拆解. 第一部分:Full th ...

  2. java内存溢出分析工具

    http://www.cnblogs.com/preftest/archive/2011/12/08/2281322.html java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老 ...

  3. C#连接solr时提示 java内存异常 (jetty和tomcat哪个更High) java.lang.OutOfMemoryError

    C#连接solr时提示 java内存异常   java.lang.OutOfMemoryError 时间:20180130 09:51:13.329,消息:异常消息<?xml version=& ...

  4. Java 内存溢出分析

    原文地址:Java 内存溢出分析 博客地址:http://www.moonxy.com 一.前言 Java 的 JVM 的内存一般可分为 3 个区:堆(heap).栈(stack)和方法区(metho ...

  5. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  6. java内存溢出分析(二)

    我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...

  7. Java内存泄漏分析系列之五:常见的Thread Dump日志案例分析

    原文地址:http://www.javatang.com 症状及解决方案 下面列出几种常见的症状即对应的解决方案: CPU占用率很高,响应很慢 按照<Java内存泄漏分析系列之一:使用jstac ...

  8. Java内存原型分析:基本知识

    转载: Java内存原型分析:基本知识 java虚拟机内存原型 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静 ...

  9. Java ConcurrentModificationException 异常分析与解决方案

    Java ConcurrentModificationException 异常分析与解决方案http://www.2cto.com/kf/201403/286536.html java.util.Co ...

  10. (转)java内存分配分析/栈内存、堆内存

    转自(http://blog.csdn.net/qh_java/article/details/9084091) java内存分配分析/栈内存.堆内存 java内存分配分析 本文将由浅入深详细介绍Ja ...

随机推荐

  1. 好代码实践:基于Redis的轻量级分布式均衡消费队列

    简介: 好代码,给人第一个印象的感觉,就像一篇好文章一样,读起来朗朗上口.不同的文章有不同的风格体裁,不同的代码也有不同的编程风格要求.Python有严格的缩进,像诗歌一样工整对仗:C语言面向过程像散 ...

  2. [GPT] 有哪些人工智能辅助工具?

      开发人工智能辅助工具可以帮助人们更高效地完成各种任务,并提高生产力和创造力.这些工具可以基于机器学习.深度学习等技术,通过对大量数据进行分析和学习,提供自动化的解决方案. 例如,一个文本翻译工具可 ...

  3. [Blockchain] Cosmos Starport 安装的三种方式

    官方二进制包方式: # 下载 starport 二进制到 /usr/local/bin $ curl https://get.starport.network/starport! | bash   # ...

  4. [ERROR] listen tcp :80: bind: permission denied

    出现这类提示的时候,表明当前用户没有权限进行 bind 操作. 在某些 Linux 云服务器提供商的运行环境中会出现. 解决方式:使用 sudo 切换为 root,然后在执行原操作. Refer:li ...

  5. 提示工程(Prompt Engineering)将ChatGPT调教为傲娇猫娘~喵

    Prompt Engineering(提示工程)是指通过设计精心构造的提示(prompt)或者输入,来引导大型语言模型生成特定类型的输出.这个技术背后的原理是利用模型对输入的敏感性,通过提供特定格式或 ...

  6. STM32的半主机与MicroLIB机制

    一.半主机模式 半主机机制的作用 半主机是作用于ARM目标的一种机制,可以将来自STM32单片机应用程序的输入与输出请求传送至运行仿真器的PC主机上.使用此机制可以启用C库中的函数,如printf() ...

  7. 实验8 #第8章 Verilog有限状态机设计-2 #Verilog #Quartus #modelsim

    2. 汽车尾灯控制器 2.1 实验要求:设计一个汽车尾灯控制电路. (1)功能:汽车左右两侧各有3个尾灯,要求控制尾灯按如下规则亮灭. 汽车沿直线行驶时,两侧指示灯全灭. 右转弯时,左侧的指示灯全灭, ...

  8. gin+grom 求当天的数据列表 0点到24点

    框架go-admin gin+gorm mysql表 CREATE TABLE `sq_user_ticket` ( `id` bigint(20) NOT NULL AUTO_INCREMENT C ...

  9. HH的项链——题解

    题目描述 直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间 转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出 ...

  10. C 语言编程 — 数据类型转换

    目录 文章目录 目录 前文列表 数据类型转换 隐式(自动)类型转换 常用的算术转换 显式(强制)类型转换 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法& ...