JVM OOM优化
jmap -heap 30378
jstat -gcutils 30378 1000 1000
jmap -histo 30378 | head -20 就可以查看某个应用pid的java服务占用内存排名前20的类
jmap -dump:format=b,file=mydump.hprof 30378
查看JAVA应用线程情况:ps p 30378 -L -o pcpu,pmem,pid,tid,time,tname,cmd
PS: 30378是JAVA进程ID
ulimit -a 查看文件句柄 查看进程被限制使用的资源
修改文件句柄:
vim /etc/security/limits.conf
# 添加如下的内容
* soft nproc 11000
* hard nproc 11000
* soft nofile 65535
* hard nofile 65535
修改完重启服务器
观察fullgc情况 尝试jvm参数修改 尝试修改xmn。建议设置的比例是年青代:年老代为1:2
总结一下FGC的原因:
(1) 调用System.gc()时,系统建议执行Full GC,但是不必然执行
(2) 老年代空间不足(老年代空间不足,在不GC就OOM,这其实可能是Major GC会和Full GC混淆使用情况)
(3) 方法区空间不足
(4) 通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5) 由Eden区、survivor space0 (From Space) 区向survivor space1 (To Space)区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小,其实也就是老年代空间不足的情况而已。
dump下来jvm日志分析方法:
1.jmap 还有一个指令可以把整个内存情况转成文件形式保存下来,如下:
jmap -dump:format=b,file=mydump.hprof 30378
2.在JVM启动时设置,如果发生OOM,则dump出文件。命令如下:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/mydump.hprof
如果快照文件不大,可以下载到本地,然后通过 MAT 分析,也可以在线分析( https://fastthread.io/ );如果快照文件很大,可以在服务器上直接分析,使用的命令是:
jhat mydump.hprof
3.jvm日志分析-使用jhat命令
jhat也是jdk内置的工具之一。主要是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
例子:jhat mydump.hprof
FastDFS优化:
一开始在测试的时候并发达到200,500左右都是很正常的。但是到了线上环境,峰值达到每秒几百个,就受不了,
在上传的时候出现各种异常
java.net,SocketException:Connection closed by remote host,Response:null
java.net.SocketException:timeout,Response:null
java.io.EOFException,Response:null
javax.net.ssl.SSLException:SSL peer shut down incorrectly,Response:null
java.io.IOException:recv package size -1 ! = 10
解放方案:
max_connections=10240 或 65535
高并发情况下扩大fastdfs最大连接数,根据服务器情况酌情扩大。
fastdfs5.05版本最大连接数256,科大讯飞语音接口,异步方法接收响应,然后在直接处理上传,相当于来了多少请求就会开多少连接,很快就会打满最大连接数,造成后面的上传异常,只有前面的上传完成后,放开了才能获取到服务端的连接,但是异步处理方法不是获取不到就阻塞住的,他是直接new了去上传,然后服务端没有连接线程来处理这个,就会返回一个空的路径或者是连接异常这种错误。
我们用fastdfs做为商户文件资料的存储,近期随着业务变动,也开始对外提供文件访问服务,发现请求偶尔会报错,异常大概如下:
java.net.SocketException: Connection reset
解决方法:
由于fastdfs客户端的实现中,storageClient、trackerServer和storageClient都不是线程安全的,而且,每次调用都会new一个socket连接,
调用完成后会关闭,所以不能复用。
在5.05版本中,storage和tracker的默认最大连接数(max_connections)为256,访问量一大就会超出报错,所以要根据场景,适当调整该值的大小。
最大并发连接数 max_connections
使用 v5.04 及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240 或 65535 甚至更大。
配置文件:tracker.conf 和 storage.conf
参数名:max_connections
缺省值:256
说明:FastDFS为一个连接分配一个task buffer,为了提升分配效率,FastDFS采用内存池的做法。
FastDFS老版本直接事先分配 max_connections 个buffer,这个做法显然不是太合理,在 max_connections 设置过大的情况下太浪费内存。
v5.04对预分配采用增量方式,tracker一次预分配 1024个,storage一次预分配256个。
#define ALLOC_CONNECTIONS_ONCE 1024
总的task buffer初始内存占用情况测算如下
改进前:max_connections * buffer_size
改进后:max_connections和预分配的连接中那个小 * buffer_size
使用v5.04及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240 甚至更大。
注意此时需要将一个进程允许打开的最大文件数调大到超过max_connections否则FastDFS server启动 会报错。
vi /etc/security/limits.conf 重启系统生效
* soft nofile 65535
* hard nofile 65535
另外,对于32位系统,请注意使用到的内存不要超过3GB
通过 ulimit -a 查看进程被限制使用的资源。
设置句柄的方式(最高只能为65535):
1、临时修改的方法:
ulimit -HSn 65535
此方法当前会话有效
2、永久修改方法(修改单个进程打开的最大句柄数)
修改配置文件的方式:设置最大进程数和最大文件打开数:
vim /etc/security/limits.conf
# 添加如下的内容
* soft nproc 11000
* hard nproc 11000
* soft nofile 65535
* hard nofile 65535
修改完重启服务器
相关推荐
Excel文件通常存储为二进制格式,如`.xls`或`.xlsx`,这些文件可以容纳大量的行和列,但当数据量过大时,可能会引发内存溢出(Out Of Memory, OOM)错误。在这种情况下,我们需要对代码进行优化以避免此类问题。本篇...
OOM 9种常见原因及解决方案 以下是OOM 9种常见原因及解决方案的知识点: 1. Java Heap Space 错误 * 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx...
如果一个应用持续占用大量内存,系统为了保护整体稳定性和用户体验,可能会触发OOM Killer,选择性地杀死一些内存占用高的进程。 **内存泄露分析:** 内存泄露是导致OOM的常见原因之一。当一个对象不再使用但仍然被...
只有在系统启动后且缓存应用优化器启用时,才会执行特定的内存优化策略。 8. **实际操作**: 要在实际项目中应用这个策略,你需要修改系统的源代码,编译并安装到设备上。由于这涉及到系统级别的更改,因此通常只...
本文将深入探讨Android内存管理的基础、内存优化策略、Bitmap的使用及管理、内存泄漏的原因和解决方案,以及如何进行内存分析。 首先,了解Android内存管理的基础至关重要。Android系统为每个应用程序分配了一个...
这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行处理时。为了解决这个问题,我们可以采用以下几种策略: 1. **分批导出**: - ...
- `图片下载及内存优化`可能是包含实际代码实现的文件,包括图片下载类、内存缓存机制以及防止OOM的逻辑。 通过对这些知识点的实践和深入理解,开发者可以构建出更加健壮、性能优秀的Android应用,同时提高用户...
- 每个Java应用在操作系统上都表现为一个或多个线程。当JVM尝试创建新线程但操作系统报告无可用资源时,会抛出此错误。 - 这可能是由于系统级别的线程限制(例如,Linux的`/proc/sys/kernel/threads-max`),或者...
长期积累,这些未释放的内存会消耗掉大量系统资源,使得程序运行效率降低,严重时会导致Java应用的OutOfMemoryError。 为了检测和解决内存泄露,我们可以使用一些工具进行内存分析,如VisualVM、JProfiler、MAT...
当Java应用程序请求的内存超过了JVM可用的内存时,就会抛出OOM异常。常见原因包括:无限递归、大量对象创建未及时释放、大对象直接进入老年代导致内存溢出等。解决OOM问题通常需要优化代码、调整内存分配或升级硬件...
MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java内存分析工具,特别适用于诊断和解决Java应用程序中的内存泄漏和性能问题。它适用于Java 1.8版本,这意味着它能够有效地处理运行在Java 8环境下的应用程序...
Java内存管理是一个关键的议题,...总的来说,理解Java内存管理和垃圾收集机制,以及如何使用工具进行分析和定位,是优化Java应用程序性能、避免内存泄漏的关键。通过有效的内存管理,可以确保程序高效且稳定地运行。
在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...
Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...
然而,如果不合理设计和优化,引导页可能会引发内存溢出(Out Of Memory,简称OOM)问题,导致应用崩溃。针对这个问题,我们需要对引导页进行优化,确保其在不同设备上稳定运行。 首先,我们要理解为什么会发生OOM...
Java内存溢出(Out of Memory,OOM)是Java应用程序中常见的问题,会导致程序崩溃或性能急剧下降。HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍...
内存溢出(Out Of Memory, OOM)是导致Java应用程序崩溃的一个常见原因。本文将围绕Java虚拟机(Java Virtual Machine, JVM)的内存管理机制展开讨论,并详细介绍如何诊断和解决内存溢出问题。 ### 内存溢出的概念 ...
OOM是Java编程语言中的一个异常,当应用程序请求的内存超过了系统分配的最大值,系统无法满足其需求时就会抛出此异常。在Android中,尤其是处理大量图片时,如果不合理地管理内存,非常容易触发OOM。 **GridView与...