系统应用服务器内存溢出解决报告

合集下载

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理在我们日常使用电脑的过程中,可能会遇到电脑开机后出现内存溢出的情况。

这是一个让人颇为头疼的问题,不仅会影响电脑的运行速度,还可能导致程序崩溃、系统死机等严重后果。

那么,当遇到这种情况时,我们应该如何处理呢?下面就来给大家详细介绍一下。

首先,我们需要了解什么是内存溢出。

简单来说,内存溢出就是指程序在运行过程中,申请的内存空间超过了系统所能提供的最大内存空间,从而导致程序无法正常运行。

这种情况通常发生在运行大型程序、多个程序同时运行或者电脑内存本身较小的情况下。

当电脑开机后出现内存溢出时,第一步我们可以尝试重新启动电脑。

有时候,可能只是系统的一时错误或者某个程序的异常导致了内存溢出,通过重启电脑,系统会重新初始化,可能会解决这个问题。

如果重启电脑后问题仍然存在,那么我们就需要深入排查原因了。

首先,检查一下是否有程序在后台大量占用内存。

可以打开任务管理器(按下 Ctrl + Shift + Esc 组合键),查看各个进程的内存使用情况。

如果发现某个程序占用内存过高,比如一些大型游戏、图形设计软件等,而此时您又不需要使用这些程序,可以将其关闭,以释放内存。

另外,电脑中的病毒和恶意软件也可能导致内存溢出。

因此,及时进行病毒扫描和查杀是很有必要的。

您可以使用电脑自带的杀毒软件或者第三方杀毒软件进行全面扫描,清除可能存在的病毒和恶意软件。

接下来,检查一下电脑的虚拟内存设置。

虚拟内存是在硬盘上开辟的一块空间,用于在物理内存不足时充当临时内存。

如果虚拟内存设置过小,也可能导致内存溢出。

在 Windows 系统中,您可以通过以下步骤设置虚拟内存:右键点击“我的电脑”,选择“属性”,然后在“高级系统设置”中点击“性能”选项下的“设置”,再切换到“高级”选项卡,点击“更改”按钮,在这里可以自定义虚拟内存的大小。

一般来说,建议将虚拟内存设置为物理内存的 15 到 2 倍。

除了以上方法,如果您的电脑内存本身较小,那么考虑升级内存也是一个不错的选择。

Redis内存溢出问题排查与解决

Redis内存溢出问题排查与解决

Redis内存溢出问题排查与解决Redis是一种高性能的键值存储数据库,常用于缓存、消息队列等场景下。

然而,在使用Redis的过程中,有时候会遇到内存溢出的问题。

本文将介绍Redis内存溢出问题的排查与解决方法。

一、Redis内存溢出问题的排查Redis的内存溢出问题可能出现在以下几个方面:1. 数据量过大:如果Redis中存储的数据量超出了其可用内存大小,就会导致内存溢出。

可以通过使用Redis的`INFO`命令来查看当前Redis实例的内存使用情况,特别关注`used_memory`和`used_memory_rss`这两个指标。

2. 频繁写入操作:如果系统中频繁进行写入操作,而没有及时进行持久化,就会导致内存中积压大量数据,进而引发内存溢出。

可以通过设置合理的`save`配置参数,将数据定期持久化到磁盘中,防止数据在内存中过多积压。

3. 大对象存储:Redis中的字符串类型可以存储的数据量最大为512MB,如果存储的对象过大,就可能导致内存溢出。

可以通过将大对象存储在其他存储介质中(如文件系统),并在Redis中存储对象的引用来解决这个问题。

4. 内存碎片问题:Redis使用的是slab分配器来管理内存,如果出现大量的内存碎片,也可能导致内存溢出。

可以通过使用`MEMORYDOCTOR`命令来检查内存碎片情况,并使用`MEMORY PURGE`命令来释放内存碎片。

二、Redis内存溢出问题的解决方法针对Redis内存溢出问题,可以采取以下解决方法:1. 增加内存:如果发现Redis的内存使用率接近或超过了可用内存的上限,可以通过增加物理内存来解决内存溢出问题。

可以使用`maxmemory`配置参数来设置Redis的最大内存限制。

2. 数据分片:可以将数据分片存储到多个Redis节点中,每个节点使用的内存较小,避免单个节点内存溢出。

可以使用Redis的集群功能或者第三方工具对数据进行分片。

3. 持久化:可以采用Redis的持久化功能,将数据定期或实时持久化到磁盘中,防止内存中数据积压过多。

JVM:全面理解线上服务器内存溢出(OOM)问题处理方案

JVM:全面理解线上服务器内存溢出(OOM)问题处理方案

JVM:全面理解线上服务器内存溢出(OOM)问题处理方案在现代应用程序开发中,内存管理是一个非常重要的方面。

虽然现代计算机中的内存容量已经非常大,但是在高负载和大数据量的情况下,仍然可能遇到内存溢出(OOM)。

内存溢出是指程序在运行过程中使用的内存量超过了系统设置的限制,导致程序运行失败。

这对生产环境的服务器是非常严重的,因为它可能导致服务器崩溃,进而影响用户体验。

JVM是Java程序的运行时环境,一旦发生线上服务器内存溢出问题,我们需要处理这个问题的步骤如下:一、分析内存溢出错误日志JVM在发生内存溢出时会产生错误日志,这些日志信息提供了非常有用的信息,有助于分析问题的原因。

在分析日志的时候,需要关注以下几个方面:1.错误信息:内存溢出错误的类型,以及导致错误的相关代码。

2.内存使用情况:分析 JVM 中各个方面的内存使用情况,例如堆内存、非堆内存、元数据内存等。

3.内存泄漏:分析可能导致内存泄漏的代码。

二、调整 JVM 参数JVM提供了很多可供调整的参数,通过调整这些参数可以使JVM 在运行过程中使用更少的内存。

例如,调整堆大小、非堆大小、GC策略等。

在选择适当的 JVM 参数时,可以参考JVM 官方文档中提供的建议参数。

但是,需要注意的是,不要随意调整JVM 参数,否则可能会导致系统运行状况更糟糕。

三、检查代码中的内存泄漏内存泄漏是指程序中申请的内存没有被及时释放,导致内存空间被占用,进而导致内存溢出。

在 Java 中,由于 Java 自带GC,因此内存泄漏的问题相对较少,但仍然有可能发生。

在排查内存泄漏问题时,可以使用 Java 堆栈跟踪工具,例如Eclipse Memory Analyzer (MAT) 来分析堆中的对象和数据,从而快速定位内存泄漏的原因。

四、优化代码优化代码是解决内存溢出问题的最重要的一步。

通过优化代码,减少对内存的消耗,可以有效地防止内存溢出问题。

优化代码的方法有很多,例如,使用缓存、避免频繁的创建多个对象、使用数据结构等。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统或者进程所能提供的上限。

导致内存溢出的原因可能是程序中存在内存泄漏、内存分配过多或者递归调用过深等。

下面将介绍三种常见的内存溢出情况及其系统配置解决方案。

1.程序内存泄漏导致内存溢出:内存泄漏指程序在运行过程中动态分配内存空间后,没有对其进行释放,导致一部分内存无法再次使用。

长时间运行的程序中,如果内存泄漏较为严重,系统可用内存会不断减少,直到最终耗尽所有内存资源。

解决方案:使用内存泄漏检测工具来检测和修复程序中的内存泄漏问题。

同时,可以考虑使用自动内存管理的编程语言,如Java和Python,在程序运行过程中自动回收未使用的内存。

2.内存分配过多导致内存溢出:解决方案:优化程序的内存使用,尽可能减小内存分配的数量和大小。

可以通过使用更高效的内存管理算法来减少内存碎片,或者使用内存池技术来提前分配一定量的内存供程序使用。

3.递归调用过深导致内存溢出:递归函数在每次调用时会将一定量的数据压入栈中,如果递归调用层数过深,栈的空间可能会超过系统的限制,从而导致内存溢出。

这种情况通常发生在没有设置递归终止条件或者递归层数过多的情况下。

解决方案:优化递归算法,设置合适的递归终止条件,避免递归调用过深。

如果无法避免使用递归算法,可以考虑使用尾递归或者迭代算法来替代递归调用,减少栈的压力。

在系统配置方面,可以采取以下措施来预防和解决内存溢出问题:1.增加系统内存容量:如果内存溢出是由于系统可用内存不足引起的,可以考虑增加系统的内存容量。

这可以通过增加物理内存条或者使用虚拟内存技术来实现。

虚拟内存技术会将部分磁盘空间用作缓存,并将一部分数据暂时存储在磁盘上,以释放内存空间。

2. 调整JVM参数:对于使用Java虚拟机(JVM)的应用程序,可以通过调整JVM的参数来控制内存的分配和管理。

例如,可以通过设置-Xmx参数来限制JVM使用的最大堆内存大小,或者通过设置-XX:MaxPermSize参数来限制JVM使用的最大持久代(PermGen)内存大小。

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理在使用电脑的过程中,我们可能会遇到电脑开机后出现内存溢出的情况。

这是一个让人颇为头疼的问题,不仅会影响电脑的正常运行,还可能导致数据丢失或系统崩溃。

那么,当我们遇到这种情况时,应该如何处理呢?首先,我们需要了解一下什么是内存溢出。

简单来说,内存溢出就是指程序在运行过程中,申请的内存空间超过了系统所能提供的最大内存空间,从而导致程序无法正常运行。

在电脑开机后出现内存溢出,可能是由于多种原因引起的。

一种常见的原因是电脑同时运行的程序过多,占用了大量的内存资源。

比如,我们在开机时自动启动了多个大型软件或进程,这些程序会在后台持续运行,消耗大量的内存。

因此,我们可以检查一下电脑的启动项,关闭一些不必要的自启动程序。

具体操作方法是按下“Ctrl+ Shift +Esc”组合键打开任务管理器,在“启动”选项卡中,禁用那些不需要开机自启的程序。

另外,电脑中存在恶意软件或病毒也可能导致内存溢出。

这些恶意程序可能会在后台偷偷运行,占用大量系统资源。

所以,我们要及时使用杀毒软件对电脑进行全面扫描,清除可能存在的恶意软件和病毒。

同时,要保持杀毒软件的实时更新,以确保能够有效地防御新出现的威胁。

内存不足也是导致内存溢出的一个重要原因。

如果电脑的物理内存本身较小,而我们又在运行一些对内存要求较高的程序,就很容易出现内存溢出的情况。

在这种情况下,我们可以考虑升级电脑的内存。

在购买新的内存之前,需要了解电脑主板支持的内存类型和最大容量,然后选择合适的内存条进行安装。

此外,系统或软件的错误或漏洞也可能引发内存溢出问题。

对于这种情况,我们可以尝试更新系统和相关软件到最新版本。

通常,软件和系统的开发者会在新版本中修复已知的漏洞和错误,从而提高系统的稳定性和兼容性。

除了上述方法,我们还可以通过一些系统设置来优化内存使用。

比如,调整虚拟内存的大小。

虚拟内存是当物理内存不足时,系统从硬盘中划分出的一部分空间作为内存使用。

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案

内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统所分配的内存空间,导致程序崩溃或出现异常。

内存溢出通常是由于程序设计或系统配置问题引起的。

以下是三种常见的内存溢出情况及相应的系统配置解决方案。

1.单个进程占用内存过大:当一些进程在运行过程中占用的内存超过系统分配的限制时,就会导致内存溢出。

这种情况通常发生在大型应用程序或者后台服务运行时。

解决方案:-增加物理内存:在服务器或计算机中增加物理内存,以满足进程运行所需的内存空间。

-调整虚拟内存:将物理内存和虚拟内存结合使用,允许操作系统使用虚拟内存作为物理内存的扩展,从而提供更大的内存容量。

-优化应用程序:通过优化程序代码、降低内存使用、合理管理资源等方法,减少进程对内存的占用。

2.长时间运行的应用程序产生泄露:有些应用程序在长时间运行后会产生内存泄露的问题,即分配并使用内存后没有将其释放,导致内存占用逐渐增加,最终导致内存溢出。

解决方案:-使用垃圾回收机制:在一些支持垃圾回收的编程语言中,通过垃圾回收机制可以自动释放未使用的内存。

开发人员可以使用这些机制来解决内存泄露问题。

-引入内存监控工具:使用内存监控工具来检测应用程序中的内存泄露,定位并解决导致内存泄露的代码问题。

-定期重启应用程序:定期重启应用程序可以清理内存,防止内存泄露导致内存溢出。

3.大规模并发请求导致内存压力增加:在高并发的情况下,当系统同时处理大量的请求时,每个请求所占用的内存可能累积增加,导致整体内存压力增加,最终出现内存溢出。

解决方案:-加大系统负载均衡能力:通过增加负载均衡器、引入缓存机制等方式,将请求分散到多台服务器上,减少单台服务器的内存压力。

-优化数据库访问:对于一些频繁读写数据库的操作,可以通过合理的数据库设计、使用索引、缓存查询结果等方法,减少对数据库的访问,降低内存压力。

-调整服务器配置:合理设置服务器的最大并发连接数、线程池大小等参数,根据实际需求分配内存资源。

IIS内存溢出报错解决方案(一)

IIS内存溢出报错解决方案(一)

项目进行SSB改造以后,当客户端从服务器抓起大笔数据的时候,服务器报一个二进制流的错误,这个错误其实是一个内存溢出的错误。

提纲故障现象故障分析与解决Code Review工具与方法故障现象用户反映在进行数据导出时经常出现下面的错误:输入流是无效的二进制格式。

开始内容(以字节为单位)是: 53-79-73-74-65-6D-2E-4F-75-74-4F-66-4D-65-6D-6F-72...坏┏鱿指么砦蠛?/SPAN>,其他后面导出的用户都会出现该错误,导致无法进行操作。

故障分析System.OutOfMemoryException 发生53-79-73-74-65-6D-2E-4F-75-74-4F-66-4D-65-6D-6F-72...System.OutOfMemor ...System.OutOfMemoryException 发生的两种情况应用程序消耗了过多的内存内存碎片过多内存Dump分析有446M的free内存, 但最大的free内存块只有26M 不足64M 。

内存碎片问题。

-------------------- Type SUMMARY --------------------------TotSize ( KB) Pct(Tots) Usage1b450000 ( 446784) : 21.30% : <free>c940000 ( 206080) : 09.83% : MEM_IMAGEa3c000 ( 10480) : 00.50% : MEM_MAPPED57824000 ( 1433744) : 68.37% : MEM_PRIVATE-------------------- State SUMMARY --------------------------TotSize ( KB) Pct(Tots) Usage2a82f000 ( 696508) : 33.21% : MEM_COMMIT1b450000 ( 446784) : 21.30% : MEM_FREE3a371000 ( 953796) : 45.48% : MEM_RESERVELargest free region: Base 58bb0000 - Size 019f0000 (26560 KB)内存中最大的一个dataset占用了18M内存,查看内容就是出现异常的导功能的内容sizeof(18e6a408) = 18,437,260 ( 0x119548c) bytes (System.Data.DataSet)…sizeof(18e6a8e0) = 18,437,260 ( 0x119548c) bytes (System.Data.DataTable)系统中一共加载了6000多种Class,其中有3000多种是<Unloaded Type>0x0ff286b4 1 32 1 <Unloaded Type>0x0ff2858c 1 32 1 <Unloaded Type>0x0ff28464 1 32 1 <Unloaded Type>0x0ff2833c 1 32 1 <Unloaded Type>0x0ff28214 1 32 1 <Unloaded Type>0x0ff280ec 1 32 1 <Unloaded Type>0x0ff27fc4 1 32 1 <Unloaded Type>0x0ff27e9c 1 32 1 <Unloaded Type>0x0ff27d74 1 32 1 <Unloaded Type>0x0ff27c4c 1 32 1 <Unloaded Type>IIS日志分析平均每天点击数:502,708一共有 5,525 个IP访问过系统,平均每天有2,658 个访问最大点击发生在 2007-11-19 达到 2,481,749次每天的8,9点是最繁忙的时候每周的星期四系统最繁忙有一些remoting的调用返回的数据太大了从日志中可以看到最大的remoting调用返回了88M的数据Remoting URI修改前最大发送字节/rs2/IInventoryQueryService.rem88171169/rs2/IEntitySequenceService.rem 33218960/rs2/IPackDataExportService.rem 25928574/rs2/ISecondBoxQureryService.rem 22226202/rs2/IEntityStatusTraceService.rem 18539971/rs2/ICodesetConfigService.rem 15605161/rs2/IOutInputInventoryService.rem 12807394/rs2/IContractQueryService.rem 9365287/rs2/IEntityTransService.rem 7995269/rs2/IEntityConfigService.rem 7563326/rs2/IQualityChkQueryService.rem 5332228/rs2/IMtlAnalyseService.rem 4457087/rs2/IProductChangeTransportService.rem 3345024/rs2/IIMEIQueryService.rem 2970797/rs2/IMobileAttachService.rem 2479021/rs2/IGetMaterialService.rem 2294796/rs2/IProductionInfoService.rem 2214683/rs2/IMbcBarcodeImeiService.rem 1687604/rs2/IWsmHighTemperatureScanService.rem 1496996/rs2/IDataManipulationService.rem 1449580故障解决增加w3wp进程可以使用的内存空间打开boot.ini的 /3GB开关[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(2)\WINNT[operating systems]multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB减少内存分配,避免内存碎片的出现修改DAO基类,将dataset的RemotingFormat ,设为SerializationFormat.BinaryRemotingFormat = SerializationFormat.Xml 或者不设RemotingFormat时,通过网络传输的DataSet大小为44MRemotingFormat = SerializationFormat.Binary时,通过网络传输的DataSet大小为12M控制从服务器返回的记录数界面上控制输入的条件范围,在服务端控制返回的记录数对数据量大的查询分页控制将RemotingServer.exe 配置为使用Server版本的GC<configuration><runtime><gcServer enabled="true"/></runtime></configuration>减少SSB动态代理类的数目按目前的设计,一个功能有1个DAO,1个DS,一个RM 三个SSB组件每个 SSB组件 SSB会使用对其动态生成一个代理类,用于进行拦截处理如果有300个功能,则会有900个动态代理类生成使用上述方法解决后的对比IIS日志对比–最大发送字节IIS日志对比–平均处理时间压力测试对比Code Review ----略过工具与方法 -- 日志分析工具通过IIS日志分析,可以统计分析出下面一些数据Web应用系统的访问量那些页面使用最频繁?Web应用的错误统计页面大小页面执行时间客户端的操作系统客户端的浏览器版本用户是如何使用我们的系统的?IIS 日志设置在进行性能调优时,我们比较关心发送的字节数, 接收的字节数以及所用时间这几个数据。

如何解决内存溢出问题

如何解决内存溢出问题

如何解决内存溢出问题?2004-12-2 17:07:28在程序员设计的代码中包含的“内存溢出”漏洞实在太多了。

本文将给大家介绍内存溢出问题的产生根源、巨大危害和解决途径。

一、为什么会出现内存溢出问题?导致内存溢出问题的原因有很多,比如:(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等。

(2) 以不可靠的方式存取或者复制内存缓冲区。

(3) 编译器设置的内存缓冲区太靠近关键数据结构。

下面来分析这些因素:1. 内存溢出问题是 C 语言或者 C++ 语言所固有的缺陷,它们既不检查数组边界,又不检查类型可靠性(type-safety)。

众所周知,用 C/C++ 语言开发的程序由于目标代码非常接近机器内核,因而能够直接访问内存和寄存器,这种特性大大提升了 C/C++ 语言代码的性能。

只要合理编码,C/C++ 应用程序在执行效率上必然优于其它高级语言。

然而,C/C++ 语言导致内存溢出问题的可能性也要大许多。

其他语言也存在内容溢出问题,但它往往不是程序员的失误,而是应用程序的运行时环境出错所致。

2. 当应用程序读取用户(也可能是恶意攻击者)数据,试图复制到应用程序开辟的内存缓冲区中,却无法保证缓冲区的空间足够时(换言之,假设代码申请了 N 字节大小的内存缓冲区,随后又向其中复制超过 N 字节的数据)。

内存缓冲区就可能会溢出。

想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出来的 4 盎司水怎么办?当然会满到玻璃杯外面了!3. 最重要的是,C/C++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。

现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。

此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。

这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。

.Net内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结

.Net内存溢出(System.OutOfMemoryException)的常见情况和处理方式总结

.Net内存溢出(System.OutOfMemoryException)的常见情况和处理⽅式总结在什么情况下会出现OutOfMemonryException呢? 在我们试图新建⼀个对象时,⽽垃圾收集器⼜找不到任何可⽤内存时被抛出,这种情况下我们是可以捕获该异常的; 另⼀种情况是,CLR需要内存时,⽽却系统却不能提供,也会抛出该异常. 但此时,我们的应⽤程序是不能捕获该错误的.内存溢出(OutOfMemoryException)的调试分析32位操作系统的寻址空间是4G,其中有2G被操作系统占⽤,也就是说留给⽤户进程的内存只有2G(其中还要扣除程序加载时映像占⽤的部分空间,⼀般只有1.6G~1.8G左右可以使⽤)。

如果进程运⾏中需要申请内存,⽽操作系统⽆法为其分配内存空间,则会产⽣内存不⾜的异常,在.net中为System.OutOfMemoryException(The exception that is thrown when there is not enough memory tocontinue the execution of a program.)。

虽然最终的表现都为OutOfMemoryException,但其产⽣的原因可能是不⼀样的,动⼿解决此问题之前需要先对进程当前内存的使⽤状态进⾏分析,找出正确的原因,才能对症下药。

下⾯分享⼀下调试此类问题的⼀些⼼得。

iis应⽤程序池内存溢出错误 System.OutOfMemoryException在 Web服务器上,所能够⽤到的内存,通常不会等同于所有的内存数量。

在machine.config配置⽂件中,配置节<processModel>中有⼀个属性“memoryLimit”,这个属性的值是⼀个百分值,默认为“60”,即指定了进程(在任务管理器中⼤家就可以看到的进程,IIS5中为aspnet_wp,IIS6中为w3wp)能够使⽤所有物理内存的60%。

电脑出现内存泄漏的原因及解决方案是什么

电脑出现内存泄漏的原因及解决方案是什么

电脑出现内存泄漏的原因及解决方案是什么在我们使用电脑的过程中,可能会遇到各种各样的问题,其中内存泄漏就是一个比较常见且让人头疼的情况。

当电脑出现内存泄漏时,系统的性能会逐渐下降,甚至可能导致程序崩溃或系统死机。

那么,究竟什么是内存泄漏?它为什么会出现?又该如何解决呢?首先,我们来了解一下什么是内存泄漏。

简单来说,内存泄漏就是指程序在运行过程中,不断地分配内存但却没有及时释放不再使用的内存,导致可用内存越来越少。

这就好比一个房间里,不断地往里堆东西,但却从不把不需要的东西清理出去,最终房间会被塞满。

接下来,我们探讨一下电脑出现内存泄漏的原因。

原因之一是编程错误。

在编写程序时,如果程序员没有正确地管理内存,比如在使用完动态分配的内存后没有调用相应的释放函数,就会导致内存泄漏。

这就像是一个粗心的人,借了东西却忘记还回去。

另一个原因是循环引用。

当两个或多个对象相互引用,形成一个无法打破的循环时,就可能导致它们占用的内存无法被释放。

比如说,A 对象引用了 B 对象,B 对象又引用了 A 对象,而且它们之间的引用关系一直存在,那么它们所占用的内存就很难被回收。

此外,资源未释放也是常见的原因之一。

比如打开文件、网络连接、数据库连接等资源后,如果在使用完毕后没有正确关闭,这些资源所占用的内存也无法被释放。

那么,面对电脑出现内存泄漏的情况,我们又该如何解决呢?第一步,我们可以通过任务管理器来监测内存使用情况。

在Windows 系统中,按下 Ctrl + Shift + Esc 组合键打开任务管理器,在“性能”选项卡中查看内存的使用情况。

如果发现某个程序的内存使用一直在增长,而没有下降的趋势,那么很可能这个程序存在内存泄漏的问题。

如果确定是某个程序存在内存泄漏,我们可以尝试重新启动该程序。

有时候,程序的一次重新启动可以解决一些临时性的内存泄漏问题。

对于由于编程错误导致的内存泄漏,如果是自己编写的程序,就需要仔细检查代码,确保在使用完动态分配的内存后进行了释放。

内存溢出的原因有哪些?怎么解决?

内存溢出的原因有哪些?怎么解决?

内存溢出的原因有哪些?怎么解决?内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

那么当你遇到这种情况时该怎么办呢?今天小编为大家整理了一些解决方法,下面我们一起来看看吧!简介内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。

这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。

就是分配的内存不足以放下数据项序列,称为内存溢出.以发生的方式来分类,内存泄漏可以分为4类:1. 常发性内存泄漏。

发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2. 偶发性内存泄漏。

发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。

常发性和偶发性是相对的。

对于特定的环境,偶发性的也许就变成了常发性的。

所以测试环境和测试方法对检测内存泄漏至关重要。

3. 一次性内存泄漏。

发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。

比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

4. 隐式内存泄漏。

程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。

严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。

但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。

所以,我们称这类内存泄漏为隐式内存泄漏。

从用户使用程序的角度来看,内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。

内存溢出解决方案

内存溢出解决方案

内存溢出解决方案内存溢出是指程序在运行过程中申请的内存超过了系统能够提供的最大内存空间,导致程序无法正常运行或崩溃。

内存溢出是常见的程序错误之一,解决内存溢出问题需要从以下几个方面入手:1. 内存泄漏:内存泄漏是指程序申请的内存没有被正确释放,导致内存使用量不断增加。

解决内存泄漏的方法是在程序开发过程中养成良好的编程习惯,及时释放不再使用的内存。

可以使用Java的垃圾回收机制自动回收无用内存,也可以手动管理内存,确保每次申请内存都能正确释放。

2.内存分配:合理地管理内存分配是避免内存溢出的重要方法之一、在编程过程中,应该避免过多地申请大块的内存空间,可以考虑分配多个小内存块来替代大内存块的申请。

此外,还应充分利用内存缓存,例如使用缓存池来减少频繁的内存分配和释放操作。

3.代码优化:优化代码可以减少内存的占用,并提高程序的执行效率。

可以采用以下方法进行代码优化:a.避免重复创建对象:重复创建对象会占用大量的内存空间,可以使用对象池或单例模式避免重复创建。

b.尽量使用基本数据类型:基本数据类型占用的内存空间较小,可以减少内存的使用量。

c.优化集合的使用:避免使用过多的集合对象,可以使用数组或自定义数据结构来代替。

d.内存重用:在需要重复使用内存的地方,可以考虑使用对象池来重复利用已经申请的内存空间。

4.资源管理:及时释放和关闭资源也是避免内存溢出的重要方法之一、在程序运行过程中,应该及时释放不再使用的资源,例如数据库连接、文件句柄等。

5.增加内存:如果程序中存在大量的数据处理或者内存消耗大的操作,可以考虑增加系统的内存大小。

增加内存可以提高程序的性能,并避免因内存不足而导致的溢出问题。

6. 使用内存管理工具:可以使用一些内存管理工具来检测和解决内存溢出问题。

例如,Java开发中可以使用JVM的内存分析工具来分析内存使用情况,如jmap、jhat、jconsole等。

总之,解决内存溢出问题需要从程序开发的各个方面入手,包括内存泄漏的排查和修复、合理的内存分配、代码的优化、资源的及时释放、增加内存等。

润乾内存溢出解决方案

润乾内存溢出解决方案

内存溢出作为软件使用过程中极其不希望看到的难题,一直困扰着软件开发与使用者。

当然在报表应用的使用过程中,如果配置或使用不当也会出现内存溢出的问题。

出现内存溢出的问题我们要敢于面对,要通过适当的排查方法和相应的解决步骤一步一步找到问题出现的原因并最终解决掉该问题。

本文对使用报表过程中出现内存溢出问题进行简单地分析,给出一些建议性的排查步骤和解决方法。

排查步骤与解决办法1 定位问题首先我们要判断出现的问题是否是由于内存溢出引起的,典型的后台信息是带有Out Of Memory字样,但是也不排除其他内存溢出的提示,如tomcat内存溢出可出现三种提示信息:Java heap space、PermGen space和unable to create new native thread。

而有时线程死锁也会导致应用挂掉。

所以我们看到具体出错信息如果判断不出是何种问题,最好上网查询确认一下。

2 判断是否与报表有关一般来说,任何应用都可能出现内存溢出,所以当我们确定出现了内存溢出,接下来要做的就是划分区域,判断内存溢出是哪部分引起的。

一般报表应用与客户自己应用相结合的系统出现内存溢出的问题,需要判断该问题是否是由报表引起的?具体方法是单独部署报表应用并执行原操作,看是否会出现内存溢出。

若此步骤问题重现,则按照如下步骤进行;否则,可能说明与报表无关,当然也可以按照下面的步骤继续进行排查。

3 查找问题出现的共性一般内存溢出不会只出现一次,这就要求我们记录每次出项问题的共性。

如:是否访问某张特定报表时出现?是否访问量达到一定程度时出现?是否访问一些大数据量报表时出现?下面给出在如下情况下的建议设置:3.1 访问某个特定报表时若我们发现,内存溢出每次均出现在访问系统中某张报表时(一般后台信息也有体现),这时我们就需要拿这张报表看看了,主要查看报表设计是否合理、表达式以及sql语句是否性能极其低下、报表计算是否非常复杂等。

内存溢出的几种原因和解决办法

内存溢出的几种原因和解决办法

内存溢出的⼏种原因和解决办法对于JVM的内存写过的⽂章已经有点多了,⽽且有点烂了,不过说那么多⼤多数在解决OOM的情况,于此,本⽂就只阐述这个内容,携带⼀些分析和理解和部分扩展内容,也就是JVM宕机中的⼀些问题,OK,下⾯说下OOM的常见情况:第⼀类内存溢出,也是⼤家认为最多,第⼀反应认为是的内存溢出,就是堆栈溢出:那什么样的情况就是堆栈溢出呢?当你看到下⾯的关键字的时候它就是堆栈溢出了:ng.OutOfMemoryError: ......java heap space.....也就是当你看到heap相关的时候就肯定是堆栈溢出了,此时如果代码没有问题的情况下,适当调整-Xmx和-Xms是可以避免的,不过⼀定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是要找到那些是垃圾才能回收,这⾥它不会认为这些东西是垃圾,⾃然不会去回收了;主意这个溢出之前,可能系统会提前先报错关键字为:ng.OutOfMemoryError:GC over head limit exceeded这种情况是当系统处于⾼频的GC状态,⽽且回收的效果依然不佳的情况,就会开始报这个错误,这种情况⼀般是产⽣了很多不可以被释放的对象,有可能是引⽤使⽤不当导致,或申请⼤对象导致,但是java heap space的内存溢出有可能提前不会报这个错误,也就是可能内存就直接不够导致,⽽不是⾼频GC.第⼆类内存溢出,PermGen的溢出,或者PermGen 满了的提⽰,你会看到这样的关键字:关键信息为:ng.OutOfMemoryError: PermGen space原因:系统的代码⾮常多或引⽤的第三⽅包⾮常多、或代码中使⽤了⼤量的常量、或通过intern注⼊常量、或者通过动态代码加载等⽅法,导致常量池的膨胀,虽然JDK 1.5以后可以通过设置对永久带进⾏回收,但是我们希望的是这个地⽅是不做GC的,它够⽤就⾏,所以⼀般情况下今年少做类似的操作,所以在⾯对这种情况常⽤的⼿段是:增加-XX:PermSize和-XX:MaxPermSize的⼤⼩。

内存溢出出现原因及解决方案

内存溢出出现原因及解决方案

内存溢出出现原因及解决方案篇一:内存溢出解决方案内存溢出解决方案篇二:内存溢出的三种情况及系统配置解决方案近经常有人咨询相关内存溢出的问题,在生产环境中tomcat内存设置不好很容易出现内存溢出。

造成内存原因是不一样的,当然处理方式也不一样。

这里根据平时遇到的情况和相关资料进行一个总结。

常见的一般会有下面三种情况:: Java heap space: PermGen space: unable to create new native thread.Tomcat内存溢出解决方案对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。

(-Xms -Xmx -XX:PermSize -XX:MaxPermSize)最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

在JVM中如果98%的时间是用于GC且可用的 Heap size不足2%的时候将抛出此异常信息。

没有内存泄露的情况下,调整-Xms -Xmx参数可以解决。

-Xms:初始堆大小-Xmx:最大堆大小但堆的大小受下面三方面影响:1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在~2G;我在20XX server 系统下(物理内存:4G和6G,jdk:)测试 1612M,64为操作系统对内存无限制。

)2.系统的可用虚拟内存限制;3.系统的可用物理内存限制。

堆的大小可以使用 java -Xmx***M version 命令来测试。

支持的话会出现jdk的版本号,不支持会报错。

-Xms-Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m第二种:永久保存区域溢出PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

这一部分用于存放Class和的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

关于32位Linux系统内存溢出问题的情况及几种常见解决方法

关于32位Linux系统内存溢出问题的情况及几种常见解决方法

关于32位Linux系统内存溢出问题的情况及几种常见解决方法由于近期Xenserver系统的OOMkill引起的批量虚拟机hang死以及刀片宕机重启问题,所以针对Out of memory 问题进行了了解和熟悉。

根据查阅网上一些文档LINUX系统具有OOM Killer的保护机制,用于避免Linux 在内存不足的时候不至于出太严重的问题,把一些无关紧要的进程杀掉,以保证系统的正常运行。

内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小是2的32次方=4 294 967 296为4G,这和实际的物理内存数量无关。

Linux内核将虚拟地址空间分成了两部分:一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间;一部分是由内核保留使用的,这部分地址是地址空间的高地址部分,从KERNELBASE到结束,称为内核空间;所以在32位系统,一个进程的可寻址范围是有限的Linux内核定义了下面三个区域:# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB# HighMem: 0x038000000 - <硬件特定>其中LowMem 区(也叫NORMAL ZONE ) 一共880 MB,而且不能改变(除非用hugemem 内核)。

对于高负载的系统,就可能因为LowMem 利用不好而引发OOM Killer 。

一个可能原因是LowFree 太少了,另外一个原因是LowMem 里都是碎片,请求不到连续的内存区域检查当前LowFree 的值:# cat /proc/meminfo |grep LowFree检查LowMem内存碎片:# cat /proc/buddyinfo上面这条命令要在2.6 Kernel 环境下有效。

内存溢出的产生原因及解决方法

内存溢出的产生原因及解决方法

内存溢出的产⽣原因及解决⽅法⼀、产⽣内存溢出的1、ng.OutofMemoryError:Java heap space2、ng.OutofMemoryError:PermGen space3、ng.OutofMemoryError:unable to create new native thread4、ng.OutofMemoryError:GC overhead limit exceeded1、Java堆空间不够,当应⽤程序申请更多的内存,⽽Java堆内存已经⽆法满⾜应⽤程序对内存的需要,将抛出这种异常。

2、Java永久代空间不够,永久代中包含类的字节码和长常量池,类的字节码加载后的信息,这和存放对象实例的堆区是不同的,⼤多数JVM的实现都不会对永久带进⾏垃圾回收,因此,只要类加载的过多就会出现这个问题。

⼀般的应⽤程序都不会产⽣这个错误,然⽽,对于Web服务器来讲,会产⽣有⼤量的JSP,JSP在运⾏时被动态的编译成Java Servlet类,然后加载到⽅法区,因此,太多的JSP的Web⼯程可能产⽣这个异常。

3、本质原因是创建了太多的线程,⽽能创建的线程数是有限制的,导致了这种异常的发⽣。

4、是在并⾏或者并发回收器在GC回收时间过长、超过98%的时间⽤来做GC并且回收了不到2%的堆内存,然后抛出这种异常进⾏提前预警,⽤来避免内存过⼩造成应⽤不能正常⼯作。

下⾯两个异常与OOM有关系,但是,⼜没有绝对关系。

1. ng.StackOverflowError …2. .SocketException: Too many open files1、是JVM的线程由于递归或者⽅法调⽤层次太多,占满了线程堆栈⽽导致的,线程堆栈默认⼤⼩为1M。

2、是由于系统对⽂件句柄的使⽤是有限制的,⽽某个应⽤程序使⽤的⽂件句柄超过了这个限制,就会导致这个问题。

⼆、产⽣原因及解决办法【情况⼀】: ng.OutOfMemoryError: Java heap space:这种是java堆内存不够,⼀个原因是真不够,另⼀个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下⾯的配置来解决: < jvm-arg>-Xms3062m < / jvm-arg> < jvm-arg>-Xmx3062m < / jvm-arg>【情况⼆】 ng.OutOfMemoryError: GC overhead limit exceeded 【解释】:JDK6新增错误类型,当GC为释放很⼩空间占⽤⼤量时间时抛出;⼀般是因为堆太⼩,导致异常的原因,没有⾜够的内存。

内存溢出错误解决

内存溢出错误解决

ng.‎O utOfMemor‎y Error: Pe‎r mGen spac‎e及其解决方法‎PermGen s‎p ace的全称是Pe‎r manent Ge‎n eration s‎p ace,是指内存的‎永久保存区域OutO‎f MemoryErr‎o r: PermGe‎n space从表面‎上看就是内存益出,解‎决方法也一定是加大内‎存。

说说为什么会内存‎益出:这一部分用于存‎放Class和Met‎a的信息,Class‎在被Load的时候‎被放入PermGen‎space区域,它‎和和存放Instan‎c e的Heap区域不‎同,GC(Garba‎g e Collect‎i on)不会在主程序‎运行期对PermGe‎n space进行清‎理,所以如果你的AP‎P会LOAD 很多CL‎A SS的话,就很可能‎出现PermGen ‎s pace错误。

这种‎错误常见在web服务‎器对JSP 进行pre‎compile的时‎候。

改正方法:-Xm‎s256m -Xmx‎256m -XX:M‎a xNewSize=‎256m-XX:M‎a xPermSize‎=256m 2、在t‎o mcat中rede‎p loy时出现out‎o fmemory的错‎误. 可以有以下几个‎方面的原因:1‎,使用了proxoo‎l,因为proxoo‎l内部包含了一个老版‎本的cglib.‎2, log4j,‎最好不用,只用com‎m on-loggin‎g3, 老版本‎的cglib,快点更‎新到最新版。

4,‎更新到最新的hibe‎r nate3.2 3‎、这里以tom‎c at环境为例,其它‎W EB服务器如jbo‎s s,weblogi‎c等是同一个道理。

‎一、‎n g.OutOfMe‎m oryError:‎PermGen s‎p ace PermG‎e n space的全‎称是Permanen‎t Generati‎o n space,是‎指内存的永久保存区域‎,这块内存主要是被‎J VM存放Class‎和Meta信息的,C‎l ass在被Load‎e r时就会被放到Pe‎r mGen spac‎e中, 它和存放类实‎例(Instance‎)的Heap区域不同‎,GC(Garbag‎e Collecti‎o n)不会在主程序运‎行期对PermGe‎n space进行清‎理,所以如果你的应用‎中有很多CLASS的‎话,就很可能出现Pe‎r mGen spac‎e错误, 这种错误常‎见在web服务器对J‎S P进行pre co‎m pile的时候。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

XXX系统应用服务器内存溢出解决报告xxxx股份有限公司2010.9目录第一章问题现象与分析 (2)1.1、问题现象 (2)1.2、通常导致这种现象的原因 (2)1.3、xxx社保宕机现象对比分析 (3)第二章解决方法路线图 (4)2.1 jvm的调整 (4)2.2 减少jvm内存使用 (5)2.2.1 加快db访问速度,减少中间件并发业务量 (5)2.2.2 限制sql返回结果集 (6)2.2.3 减少业务会话中存放的对象 (6)2.3 补救措施 (6)第三章、解决结果与进一步建议 (6)3.1 解决结果 (6)3.2 进一步建议 (7)第一章问题现象与分析1.1、问题现象XXX应用服务器经常有内存溢出、系统没有响应的现象,尤其在每月的月末最为明显。

目前的应用服务器有三种类型,其中ibm和linux应用服务器报告频繁出现内存溢出或没有响应的现象,hp unix应用服务器相稳定。

在出现问题期间Weblogic无法响应任何客户端请求,大量请求加载到了这台没有响应的Server上,最后只有杀掉并重启这台应用服务器。

1.2、通常导致这种现象的原因WLS Server 没响应可能的几种原因:1、繁重的I/O,呼叫DB时间过长导致中间件内存耗尽,server没有响应。

2、程序死循环,loop-backs,这种情况cpu很忙,系统没有响应。

3、连接到外部server,没响应,由于网络等原因4、2个以上的执行者同步死锁5、业务量过大,全部线程都被占用,出现队列等待现象6、读写本地I/O,发生阻塞WLS Server 宕机的原因:OutOfMemoryJNI程序jvm的bugos的bug1.3、xxx社保宕机现象对比分析✓应用服务器没有响应分析通过初步判断,对于xxx应用服务器没有响应的情况可以做如下排出法解决:――程序死循环这种情况会导致cpu非常繁忙,而通过目前观察,每次系统没响应的时候,cpu没有一直100%忙,另外,对出现问题时的java core分析没有发现这类线程,因此可以基本排除这种可能,。

――连接到外部server,没响应,由于网络等原因目前我们的业务基本都是直接通过中间件访问数据,没有通过应用服务器间调用或多数据库调用的,基本排除这种可能。

――2个以上的执行者同步死锁这种情况有可能,但比较难找,一般都是业务高峰的时候才有可能出现,跟应用人员了解后得知我们很少使用同步方式实现对资源的共享。

另外通过对javacore进行分析,并未发现同步造成的死锁现象。

――业务量过大,全部线程都被占用,出现队列等待现象通过观察我们的业务量在高峰时确实很大,但由于我们配置的线程数都很高,尽管出现宕机时也没有达到配置的上线,所以这个方面可以被排除。

――繁重的I/O,呼叫DB时间过长导致中间件内存耗尽由于我们经常有新业务变更,尤其近期还有居民医保业务上线,因此I/O问题导致的因素也需要重点考察!――读写本地I/O,发生阻塞,多线程耗尽jvm内存这种现象很可能发生,应重点给予关注✓对WLS SERVER 宕机的几种情况的分析:――OufOfMemory目前xxx社保应用服务器出现宕机的时候基本都表现为这种现象,这也是中间件服务器最常见的现象。

原因可能有多种,可能是平台的,多数情况下是物理内存配置过低,或jvm参数配置过低造成的。

但通过对xxx社保配置参数进行分析发现参数基本合理,除了线程数和连接池配置稍大点,其它都很正常。

由此分析是估计是其它原因造成的。

其它可能的原因可能是平台原因,比如jvm版本、垃圾回收方式和算法的缺陷等;也可能是应用造成的,比如业务并发量过大,内存不足造成,也可能是返回大结果集以及会话存放对象过多等原因。

因此重点是找出可行的解决方案,避免出现内存溢出,减少对jvm内存的使用量。

――平台bug比如jni、jvm、os的bug等。

每个weblogic版本都有对应的平台Jni,用来增加系统性能,但有时表现出不稳定的现象。

Jvm和os版本对WLS server的稳定更是影响很大,通过以前的记录发现ibm和linux的应用服务器比hp出现的宕机频率更多些,因此有必要对ibm和linuxjvm做些分析和调整。

第二章解决方法路线图通过前面分析把解决问题的路线图定位在三方面,一个是调整现有平台jvm版本和参数,尽量达到平台的稳定性;另外一个是考虑如何减少jvm内存的使用上,尤其要解决访问DB慢以及返回大结果集这两方面,以期通过增强访问速度减少并发量,减少返回结果对内存的占用,从而使系统不发生或少发生OutOfMemory现象。

另外,在意外出现宕机的情况下,通过负载均衡器的配置实现新请求直接发送给其它运行正常的服务器。

2.1 jvm的调整采用方法:调整ibm应用服务器的jvm 系统参数kcluster等,消除内存碎片。

调整linux应用服务器的jvm ,由bea的jrockit到sun jdk。

实际效果:Ibm服务器jvm为1.4.2,由于本版本的垃圾回收算法问题,会出现内存碎片,7月份相应调整了jvm参数,不过还是宕机很多次,没有明显效果。

通过对8月份ibm服务器一次宕机javacore分析,发现在高峰阶段jvm还是会出现heap lock资源等待现象,经查ibm资料,基本上还是证实是内存碎片过多,并发申请内存太多导致系统无内存可用,最后宕机。

不过8月份已经好很多了,才发现一次。

这种情况目前最好方法是通过减少并发量来解决,由于应用的原因目前还无法升级jvm。

Linux服务器的jvm通过从jroick调整到sun后,在7月份就效果就很好。

在8月份系统出现一次没有响应了,当时内存还是剩余很多的,现象也是OutOfMemory,但同时报sun javaException in thread "CompilerThread0"ng.OutOfMemoryError: requested 32760 bytesforChunkPool::allocate. Out of swap space?经查这种现象跟在linux平台上jvm虚拟机不稳定有关,但这种现象不会经常出现。

2.2 减少jvm内存使用想办法减少jvm内存使用量是解决问题的关键,减少应用服务器瞬时的并发量是一个好的途径,这就要保证快速的DB访问,小的结果集返回,session中少量的保存对象,同时会话保持不宜过长。

2.2.1 加快db访问速度,减少中间件并发业务量采用方法1:通过oracle oem等工具跟踪监控大量耗I/O的语句,同时监控其它影响db服务器运行慢的进程。

实际效果:项目组调整低性能的sql后,该部分业务明显加快,没有再发现相关业务的大量全表扫描等情况。

采用方法2:对影响应收预览速度的ac40瘦身,重建并进行了分区。

实际效果:根据现场反映速度有些提升。

但由于对另外一个影响速度的关键表ab30无法瘦身(医保业务用),目前应收预览速度要有质的飞跃还很难。

2.2.2 限制sql返回结果集采用方法:从底层编写监控sql返回的大结果集程序,可定制记录数等参数实际效果:目前已经抓到很多大sql,返回的结果集从几千达到10几万以上,基本消除了大结果集造成的原因,长期部署可对新程序新业务的大结果集检验有非常大的好处。

2.2.3 减少业务会话中存放的对象采用方法:减少会话中的存放对象数,把没有必要或不需要使用的对象从会话中清除。

实际效果:这是一个备用手段,由于是改动了程序,为了生产安全考虑,暂时没有部署,在其它手段没有效果的情况下经过测试后再把它加载上去。

2.3 对本地读写的定位通过对大量ibm java core分析,发现有读写I/O导致的堵塞。

2.4 补救措施方法:在应用服务器上部署一个test.html静态页面,同时在负载均衡器上配置对这个静态页面的定时访问。

结果:通过8月份业务的实际运行考验确实起到了作用,7月份当一台服务器没有响应的时候马上就有业务人员反映,8月份却没有,同时我们也发现了的确新的请求就不再发给问题服务器,重新启动后新请求一点一点的加载上来,改善是很有效果的。

第三章、解决结果与进一步建议3.1 解决结果通过两个月周期的现场分析、调整,目前应用服务器系统稳定性已经明显提高了。

尽管月底个别高峰的时候还会出现系统没有响应情况,但通过其它手段弥补已经不会影响业务的运行。

分析导致系统宕机因素是多方面的,包括java平台的原因,程序大结果集的原因,表数据量大/sql程序不够优化的原因,阵列I/O性能的原因、并发大业务的等原因。

这些原因往往交织在一起,呈现出各种系统宕机状况。

但最终只要我们提高sql的运行速度,降低jvm 的内存使用量,把握好大的结果集和大的业务对象使用,尽管jvm本身有不稳定的情况,也不会或很少出现jvm宕机现象的。

3.2 进一步建议✓优化或升级现有阵列目前整体系统的瓶颈在I/O上,希望考虑阵列升级计划。

✓对目前业务数据和程序做一个周期瘦身和优化方案从系统整体性能分析看,不良的I/O状况,越来越多的上亿记录的表导致大量对数据库操作业务缓慢,使中间件服务器并发量瞬时增加,中间件服务器的负载量加重,也成为中间件的宕机的一个主要原因。

✓优化本地I/O读写,将日志调试信息去掉。

✓对新业务继续监控大结果集(目前部署在11、12上)。

✓对新业务继续要做及时监控,抓大sql(耗I/O量大,运行次数多,阻塞其它业务)。

相关文档
最新文档