网站首页 > 技术文章 正文
文章来源:微信公众号思快奇
确保系统持续、稳定的运行是系统管理人员必须具备的基本素质。正常部署ELK日志分析平台,运行一个月后我们正有感于系统带来的方便之时,自动化监控平台发现一台Elasticsearch节点崩溃了。
报错类似如下部分:
[2018-06-29T08:40:07,221][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [node02] fatal error in thread [elasticsearch[node02][bulk][T#2]], exiting
java.lang.OutOfMemoryError: Java heap space
很明显依赖的java堆内存超标了(ES默认配置是2G),查看官网介绍:JVM 堆是有限资源的,应该被合理利用。限制fielddata对堆使用的影响有多套机制,这些限制方式非常重要,因为堆栈的乱用会导致节点不稳定(感谢缓慢的垃圾回收机制),甚至导致节点宕机(通常伴随 OutOfMemory 异常)。
更改配置信息,观察一个月发现问题得到解决。
jvm.options
-Xms4g
-Xmx4g
此处系统内存的50%
elasticsearch.yml
限制fielddata 上限
indices.fielddata.cache.size: 20%
本次问题中有个JVM的概念,我们来温习一下。对操作系统来说JVM是一个的进程,这个进程的基本结构如下,包括:类加载器子系统、运行时数据区、执行引擎和本地方法接口。
操作系统把一个程序在内存中所占的空间分为:方法区、数据区、堆区、栈区,同样,JVM在内存中也有JVM方法区、JVM数据区、堆区和栈区。
- 代码区 :中存放应用程序的机器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。
- 数据区: 中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。
- 堆: 是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。
- 栈区: 用来存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分配新内存空间的预备区域。
其中堆内存(Heap memory)的设置是非常重要的,因为java的运行取决于一个合理的堆(heap)大小,如果太小,在许多垃圾回收或是高性能的情况下就会出现OutOfMemory异常,如果堆太大,垃圾回收将需要更大的数据,该算法将要面对更高数量的存活堆,这使操作系统也会面对较大的压力。
所以可以通过监控JVM的使用情况来推算设置一个更优的堆大小数据,比如使用java自带的visualVM工具(JAVA_HOME\bin\目录下的jvisualvm.exe)就可以满足哦,有兴趣的同学可以玩一玩,MAY U HAVA FUN !
相关阅读
自动化 | 如何快速排查生产客诉问题
大数据 | 打鱼,你是用鱼网还是鱼竿呢?
参考:
- CSDN:JVM的基本结构
- ES官网API
猜你喜欢
- 2024-10-12 SpringBoot执行jar报错java.lang.OutOfMemoryError_指定内存大小
- 2024-10-12 几种内存溢出(内存溢出类型)
- 2024-10-12 JVM优化:实战OutOfMemoryError异常
- 2024-10-12 JVM 在遇到OOM(OutOfMemoryError)时生成Dump文件的三种方式
- 2024-10-12 线上故障排查全套路,总有一款适合你
- 2024-10-12 面试被问到“零拷贝”!你真的理解吗?
- 2024-10-12 面试夺命三问之《内存溢出和逃逸分析》
- 2024-10-12 阿里面试官:Exception和Error有什么区别?
- 2024-10-12 Eclipse运行大量文件异常OutOfMemoryError: GC overhead limit
- 2024-10-12 记一次线上内存异常排查实战(线上内存泄漏如何定位)
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)