系统应用服务器内存溢出解决报告
电脑开机后出现内存溢出该如何处理

电脑开机后出现内存溢出该如何处理在我们日常使用电脑的过程中,可能会遇到电脑开机后出现内存溢出的情况。
这是一个让人颇为头疼的问题,不仅会影响电脑的运行速度,还可能导致程序崩溃、系统死机等严重后果。
那么,当遇到这种情况时,我们应该如何处理呢?下面就来给大家详细介绍一下。
首先,我们需要了解什么是内存溢出。
简单来说,内存溢出就是指程序在运行过程中,申请的内存空间超过了系统所能提供的最大内存空间,从而导致程序无法正常运行。
这种情况通常发生在运行大型程序、多个程序同时运行或者电脑内存本身较小的情况下。
当电脑开机后出现内存溢出时,第一步我们可以尝试重新启动电脑。
有时候,可能只是系统的一时错误或者某个程序的异常导致了内存溢出,通过重启电脑,系统会重新初始化,可能会解决这个问题。
如果重启电脑后问题仍然存在,那么我们就需要深入排查原因了。
首先,检查一下是否有程序在后台大量占用内存。
可以打开任务管理器(按下 Ctrl + Shift + Esc 组合键),查看各个进程的内存使用情况。
如果发现某个程序占用内存过高,比如一些大型游戏、图形设计软件等,而此时您又不需要使用这些程序,可以将其关闭,以释放内存。
另外,电脑中的病毒和恶意软件也可能导致内存溢出。
因此,及时进行病毒扫描和查杀是很有必要的。
您可以使用电脑自带的杀毒软件或者第三方杀毒软件进行全面扫描,清除可能存在的病毒和恶意软件。
接下来,检查一下电脑的虚拟内存设置。
虚拟内存是在硬盘上开辟的一块空间,用于在物理内存不足时充当临时内存。
如果虚拟内存设置过小,也可能导致内存溢出。
在 Windows 系统中,您可以通过以下步骤设置虚拟内存:右键点击“我的电脑”,选择“属性”,然后在“高级系统设置”中点击“性能”选项下的“设置”,再切换到“高级”选项卡,点击“更改”按钮,在这里可以自定义虚拟内存的大小。
一般来说,建议将虚拟内存设置为物理内存的 15 到 2 倍。
除了以上方法,如果您的电脑内存本身较小,那么考虑升级内存也是一个不错的选择。
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)问题处理方案在现代应用程序开发中,内存管理是一个非常重要的方面。
虽然现代计算机中的内存容量已经非常大,但是在高负载和大数据量的情况下,仍然可能遇到内存溢出(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内存溢出报错解决方案(一)

项目进行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++ 编译器开辟的内存缓冲区常常邻近重要的数据结构。
现在假设某个函数的堆栈紧接在在内存缓冲区后面时,其中保存的函数返回地址就会与内存缓冲区相邻。
此时,恶意攻击者就可以向内存缓冲区复制大量数据,从而使得内存缓冲区溢出并覆盖原先保存于堆栈中的函数返回地址。
这样,函数的返回地址就被攻击者换成了他指定的数值;一旦函数调用完毕,就会继续执行“函数返回地址”处的代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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量大,运行次数多,阻塞其它业务)。