`
gaozzsoft
  • 浏览: 427022 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Java应用OOM内存过高解决及优化

 
阅读更多

 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

修改完重启服务器

 

分享到:
评论

相关推荐

    java poi 读取百万数据OOM优化

    Excel文件通常存储为二进制格式,如`.xls`或`.xlsx`,这些文件可以容纳大量的行和列,但当数据量过大时,可能会引发内存溢出(Out Of Memory, OOM)错误。在这种情况下,我们需要对代码进行优化以避免此类问题。本篇...

    教你分析9种OOM常见原因及解决方案.docx

    OOM 9种常见原因及解决方案 以下是OOM 9种常见原因及解决方案的知识点: 1. Java Heap Space 错误 * 原因分析:请求创建一个超大对象、超出预期的访问量/数据量、过度使用终结器、内存泄漏 * 解决方案:通过 -Xmx...

    安卓内存OOM分析

    如果一个应用持续占用大量内存,系统为了保护整体稳定性和用户体验,可能会触发OOM Killer,选择性地杀死一些内存占用高的进程。 **内存泄露分析:** 内存泄露是导致OOM的常见原因之一。当一个对象不再使用但仍然被...

    android 11源码中如何提高应用oom_adj级别,保活应用(csdn)————程序.pdf

    只有在系统启动后且缓存应用优化器启用时,才会执行特定的内存优化策略。 8. **实际操作**: 要在实际项目中应用这个策略,你需要修改系统的源代码,编译并安装到设备上。由于这涉及到系统级别的更改,因此通常只...

    Android内存OOM优化详解.pdf

    本文将深入探讨Android内存管理的基础、内存优化策略、Bitmap的使用及管理、内存泄漏的原因和解决方案,以及如何进行内存分析。 首先,了解Android内存管理的基础至关重要。Android系统为每个应用程序分配了一个...

    java解决大批量数据导出Excel产生内存溢出的方案

    这是因为Excel文件格式本身的设计,以及Java默认处理大数据的方式,可能导致内存占用过高,尤其是在一次性加载大量数据到内存中进行处理时。为了解决这个问题,我们可以采用以下几种策略: 1. **分批导出**: - ...

    Android 图片下载以及内存处理防止OOM内存溢出 源码

    - `图片下载及内存优化`可能是包含实际代码实现的文件,包括图片下载类、内存缓存机制以及防止OOM的逻辑。 通过对这些知识点的实践和深入理解,开发者可以构建出更加健壮、性能优秀的Android应用,同时提高用户...

    内存不足OOM java.lang.OutOfMemoryError.

    - 每个Java应用在操作系统上都表现为一个或多个线程。当JVM尝试创建新线程但操作系统报告无可用资源时,会抛出此错误。 - 这可能是由于系统级别的线程限制(例如,Linux的`/proc/sys/kernel/threads-max`),或者...

    java内存分析-内存泄露问题.rar

    长期积累,这些未释放的内存会消耗掉大量系统资源,使得程序运行效率降低,严重时会导致Java应用的OutOfMemoryError。 为了检测和解决内存泄露,我们可以使用一些工具进行内存分析,如VisualVM、JProfiler、MAT...

    java入门、java内存区域和OOM、垃圾回收器和垃圾回收策略

    当Java应用程序请求的内存超过了JVM可用的内存时,就会抛出OOM异常。常见原因包括:无限递归、大量对象创建未及时释放、大对象直接进入老年代导致内存溢出等。解决OOM问题通常需要优化代码、调整内存分配或升级硬件...

    OOM java分析mat工具

    MAT,全称Memory Analyzer Tool,是IBM开发的一款强大的Java内存分析工具,特别适用于诊断和解决Java应用程序中的内存泄漏和性能问题。它适用于Java 1.8版本,这意味着它能够有效地处理运行在Java 8环境下的应用程序...

    基于Java的内存泄露分析及定位

    Java内存管理是一个关键的议题,...总的来说,理解Java内存管理和垃圾收集机制,以及如何使用工具进行分析和定位,是优化Java应用程序性能、避免内存泄漏的关键。通过有效的内存管理,可以确保程序高效且稳定地运行。

    内存泄漏与内存溢出

    在软件开发领域,尤其是涉及到数据库应用的场景下,内存泄漏(Memory Leak)和内存溢出(Out of Memory,简称OOM)是两个常见的问题,它们直接影响到程序的性能、稳定性和可扩展性。以下是对这两个概念及其相关知识...

    JAVA内存溢出详解.doc

    Java内存溢出(Out Of Memory,OOM)是Java应用程序运行时常见的问题,它通常发生在程序对内存需求超过了Java虚拟机(JVM)所能提供的可用内存时。本文将深入探讨Java内存溢出的原因、表现以及如何解决。 1. **Java...

    引导页优化 防止oom

    然而,如果不合理设计和优化,引导页可能会引发内存溢出(Out Of Memory,简称OOM)问题,导致应用崩溃。针对这个问题,我们需要对引导页进行优化,确保其在不同设备上稳定运行。 首先,我们要理解为什么会发生OOM...

    java 内存溢出分析工具 HeapAnalyzer

    Java内存溢出(Out of Memory,OOM)是Java应用程序中常见的问题,会导致程序崩溃或性能急剧下降。HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍...

    Java虚拟内存研究

    内存溢出(Out Of Memory, OOM)是导致Java应用程序崩溃的一个常见原因。本文将围绕Java虚拟机(Java Virtual Machine, JVM)的内存管理机制展开讨论,并详细介绍如何诊断和解决内存溢出问题。 ### 内存溢出的概念 ...

    GridView解决OOM

    OOM是Java编程语言中的一个异常,当应用程序请求的内存超过了系统分配的最大值,系统无法满足其需求时就会抛出此异常。在Android中,尤其是处理大量图片时,如果不合理地管理内存,非常容易触发OOM。 **GridView与...

Global site tag (gtag.js) - Google Analytics