Java内存溢出的解决方法
- 格式:docx
- 大小:16.48 KB
- 文档页数:6
解决溢出问题的方法
解决溢出问题的方法主要有以下几种:
1. 代码审查和优化:通过仔细审查代码,找出可能导致溢出的源头,如大量数据的处理、循环引用等。
优化这些代码段,减少内存使用。
2. 调整内存参数:调整JVM的启动参数,如-Xms和-Xmx参数,可以动态调整内存分配。
这可以帮助避免内存溢出。
3. 使用内存分析工具:使用内存分析工具(如MAT)来分析内存使用情况,找出并解决内存泄漏问题。
4. 避免大对象分配:尽量避免一次性分配大量内存,可以将大任务拆分成小任务,逐个处理。
5. 优化数据库查询:数据库查询可能导致大量数据加载到内存中,可以通过优化查询语句,减少数据加载量。
6. 升级硬件:在某些情况下,增加物理内存或升级其他硬件(如硬盘)可能有助于解决溢出问题。
7. 使用缓存技术:对于频繁使用的数据,可以使用缓存技术来减少对数据库的访问,从而减少内存使用。
8. 日志分析:仔细分析应用程序日志,查找可能导致溢出的异常或错误。
9. 垃圾回收优化:根据应用程序的特点,选择合适的垃圾回收策略,以减少内存碎片和垃圾回收开销。
10. 避免第三方软件BUG:确保使用的第三方软件没有已知的内存泄漏问题或BUG,并及时更新软件。
这些方法可以根据实际情况进行选择和应用,一般需要通过不断测试和调优来找到最适合的解决方案。
java中遇到的问题和解决方案
目录
1. Java中遇到的问题
1.1 内存溢出问题
1.2 死锁问题
2. 解决方案
2.1 内存溢出问题的解决方案
2.2 死锁问题的解决方案
Java中遇到的问题
在Java编程过程中,经常会遇到各种各样的问题,其中两个比较常见的问题是内存溢出和死锁问题。
内存溢出问题是指程序在运行过程中申请的内存超过了系统能够分配给它的内存大小,导致程序崩溃。
这种问题通常发生在程序中频繁创建大量对象或者持续运行时间过长的情况下。
死锁问题则是指多个线程互相持有对方所需要的资源,导致彼此无法继续执行,进而导致程序无法正常运行。
死锁问题通常发生在多线程编程中,处理不当时很容易出现。
解决方案
针对内存溢出问题,可以通过一些方法来解决,比如增加堆内存大小、优化程序代码以减少内存占用、及时释放不再使用的对象等。
另外,可以使用一些工具来监控程序内存使用情况,及时发现并解决潜在的内存溢出问题。
对于死锁问题,可以通过合理地设计程序逻辑、避免使用过多的同步代码块、避免嵌套锁等方法来预防死锁的发生。
此外,可以使用一些工具来帮助检测程序中潜在的死锁问题,并及时处理。
综上所述,如果在Java编程过程中遇到内存溢出或死锁问题,可以通过上述方法来解决,确保程序的稳定运行。
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) 来分析堆中的对象和数据,从而快速定位内存泄漏的原因。
四、优化代码优化代码是解决内存溢出问题的最重要的一步。
通过优化代码,减少对内存的消耗,可以有效地防止内存溢出问题。
优化代码的方法有很多,例如,使用缓存、避免频繁的创建多个对象、使用数据结构等。
完美解决java读取⼤⽂件内存溢出的问题1. 传统⽅式:在内存中读取⽂件内容读取⽂件⾏的标准⽅式是在内存中读取,Guava 和Apache Commons IO都提供了如下所⽰快速读取⽂件⾏的⽅法:Files.readLines(new File(path), Charsets.UTF_8);FileUtils.readLines(new File(path));实际上是使⽤BufferedReader或者其⼦类LineNumberReader来读取的。
传统⽅式的问题:是⽂件的所有⾏都被存放在内存中,当⽂件⾜够⼤时很快就会导致程序抛出OutOfMemoryError 异常。
问题思考:我们通常不需要把⽂件的所有⾏⼀次性地放⼊内存中,相反,我们只需要遍历⽂件的每⼀⾏,然后做相应的处理,处理完之后把它扔掉。
所以我们可以通过⾏迭代⽅式来读取,⽽不是把所有⾏都放在内存中。
2. ⼤⽂件读取处理⽅式不重复读取与不耗尽内存的情况下处理⼤⽂件:(1)⽂件流⽅式:使⽤java.util.Scanner类扫描⽂件的内容,⼀⾏⼀⾏连续地读取FileInputStream inputStream = null;Scanner sc = null;try {inputStream = new FileInputStream(path);sc = new Scanner(inputStream, UTF-8);while (sc.hasNextLine()) {String line = sc.nextLine();// System.out.println(line);}}catch(IOException e){logger.error(e);}finally {if (inputStream != null) {inputStream.close();}if (sc != null) {sc.close();}}该⽅案将会遍历⽂件中的所有⾏,允许对每⼀⾏进⾏处理,⽽不保持对它的引⽤。
java内存溢出排查方法解析内存溢出(out of mem or y),通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件或游戏一段时间。
内存溢出已经是软件开发历史上存在了近40年的“老大难”问题,像在“红色代码”病毒事件中表现的那样,它已经成为黑客攻击企业网络的“罪魁祸首”。
如在一个域中输入的数据超过了它的要求就会引发数据溢出问题,多余的数据就可以作为指令在计算机上运行。
据有关安全小组称,操作系统中超过50%的安全漏洞都是由内存溢出引起的,其中大多数与微软的技术有关。
定义及原因内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。
为了解决Java中内存溢出问题,我们首先必须了解Java是如何管理内存的。
Java的内存管理就是对象的分配和释放问题。
在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollec ti on,GC)完成的,程序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。
但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。
Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。
1、内存溢出的原因是什么?内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。
如果出现这种现象可行代码排查:一)是否App中的类中和引用变量过多使用了Stat ic修饰如publicst ai tc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。
内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统或者进程所能提供的上限。
导致内存溢出的原因可能是程序中存在内存泄漏、内存分配过多或者递归调用过深等。
下面将介绍三种常见的内存溢出情况及其系统配置解决方案。
1.程序内存泄漏导致内存溢出:内存泄漏指程序在运行过程中动态分配内存空间后,没有对其进行释放,导致一部分内存无法再次使用。
长时间运行的程序中,如果内存泄漏较为严重,系统可用内存会不断减少,直到最终耗尽所有内存资源。
解决方案:使用内存泄漏检测工具来检测和修复程序中的内存泄漏问题。
同时,可以考虑使用自动内存管理的编程语言,如Java和Python,在程序运行过程中自动回收未使用的内存。
2.内存分配过多导致内存溢出:解决方案:优化程序的内存使用,尽可能减小内存分配的数量和大小。
可以通过使用更高效的内存管理算法来减少内存碎片,或者使用内存池技术来提前分配一定量的内存供程序使用。
3.递归调用过深导致内存溢出:递归函数在每次调用时会将一定量的数据压入栈中,如果递归调用层数过深,栈的空间可能会超过系统的限制,从而导致内存溢出。
这种情况通常发生在没有设置递归终止条件或者递归层数过多的情况下。
解决方案:优化递归算法,设置合适的递归终止条件,避免递归调用过深。
如果无法避免使用递归算法,可以考虑使用尾递归或者迭代算法来替代递归调用,减少栈的压力。
在系统配置方面,可以采取以下措施来预防和解决内存溢出问题:1.增加系统内存容量:如果内存溢出是由于系统可用内存不足引起的,可以考虑增加系统的内存容量。
这可以通过增加物理内存条或者使用虚拟内存技术来实现。
虚拟内存技术会将部分磁盘空间用作缓存,并将一部分数据暂时存储在磁盘上,以释放内存空间。
2. 调整JVM参数:对于使用Java虚拟机(JVM)的应用程序,可以通过调整JVM的参数来控制内存的分配和管理。
例如,可以通过设置-Xmx参数来限制JVM使用的最大堆内存大小,或者通过设置-XX:MaxPermSize参数来限制JVM使用的最大持久代(PermGen)内存大小。
Java堆内存溢出原因分析前⾔任何使⽤过基于 Java 的企业级后端应⽤的软件开发者都会遇到过这种低劣、奇怪的报错,这些报错来⾃于⽤户或是测试⼯程师: ng.OutOfMemoryError:Java heap space。
为了弄清楚问题,我们必须返回到算法复杂性的计算机科学基础,尤其是“空间”复杂性。
如果我们回忆,每⼀个应⽤都有⼀个最坏情况特征。
具体来说,在存储维度⽅⾯,超过推荐的存储将会被分配到应⽤程序上,这是不可预测但尖锐的问题。
这导致了堆内存的过度使⽤,因此出现了"内存不够"的情况。
这种特定情况最糟糕的部分是应⽤程序不能修复,并且将崩溃。
任何重启应⽤的尝试 - 甚⾄使⽤最⼤内存(-Xmx option)- 都不是长久之计。
如果不明⽩什么导致了堆使⽤的膨胀或突出,内存使⽤稳定性(即应⽤稳定性)就不能保障。
于是,什么才是更有效的理解关于内存的编程问题的途径?当内存溢出时,明⽩应⽤程序的内存堆和分布情况才能回答这个问题。
在这⼀前提下,我们将聚焦以下⽅⾯:当内存溢出时,获取到 Java 进程中的堆转储。
明⽩应⽤程序正在遭遇的内存问题的类型。
使⽤⼀个堆分析器,可以使⽤ Eclipse MAT 这个优秀的开源项⽬来分析内存溢出的问题。
配置应⽤,为堆分析做准备任何像内存溢出这种⾮确定性的、时有时⽆的问题对于事后的分析都是⼀个挑战。
所以,最好的处理内存溢出的⽅法是让JVM 虚拟机转储⼀份 JVM 虚拟机内存状态的堆⽂件。
Sun HotSpot JVM 有⼀种⽅法可以引导 JVM 转储内存溢出时的堆状态到⼀个⽂件中。
其标准格式为 .hprof 。
所以,为了实现这种操作,向 JVM 启动项中添加 XX:+HeapDumpOnOutOfMemoryError 。
因为内存溢出可能经过很长⼀段时间才会发⽣,向⽣产系统增加这⼀选项也是必须的。
如果堆转储 .hprof ⽂件必须被写在⼀个特定的⽂件系统位置,那么就添加⽬录途径到 XX:HeapDumpPath 。
内存溢出的三种情况及系统配置解决方案内存溢出是指程序在运行过程中申请的内存超过了系统所分配的内存空间,导致程序崩溃或出现异常。
内存溢出通常是由于程序设计或系统配置问题引起的。
以下是三种常见的内存溢出情况及相应的系统配置解决方案。
1.单个进程占用内存过大:当一些进程在运行过程中占用的内存超过系统分配的限制时,就会导致内存溢出。
这种情况通常发生在大型应用程序或者后台服务运行时。
解决方案:-增加物理内存:在服务器或计算机中增加物理内存,以满足进程运行所需的内存空间。
-调整虚拟内存:将物理内存和虚拟内存结合使用,允许操作系统使用虚拟内存作为物理内存的扩展,从而提供更大的内存容量。
-优化应用程序:通过优化程序代码、降低内存使用、合理管理资源等方法,减少进程对内存的占用。
2.长时间运行的应用程序产生泄露:有些应用程序在长时间运行后会产生内存泄露的问题,即分配并使用内存后没有将其释放,导致内存占用逐渐增加,最终导致内存溢出。
解决方案:-使用垃圾回收机制:在一些支持垃圾回收的编程语言中,通过垃圾回收机制可以自动释放未使用的内存。
开发人员可以使用这些机制来解决内存泄露问题。
-引入内存监控工具:使用内存监控工具来检测应用程序中的内存泄露,定位并解决导致内存泄露的代码问题。
-定期重启应用程序:定期重启应用程序可以清理内存,防止内存泄露导致内存溢出。
3.大规模并发请求导致内存压力增加:在高并发的情况下,当系统同时处理大量的请求时,每个请求所占用的内存可能累积增加,导致整体内存压力增加,最终出现内存溢出。
解决方案:-加大系统负载均衡能力:通过增加负载均衡器、引入缓存机制等方式,将请求分散到多台服务器上,减少单台服务器的内存压力。
-优化数据库访问:对于一些频繁读写数据库的操作,可以通过合理的数据库设计、使用索引、缓存查询结果等方法,减少对数据库的访问,降低内存压力。
-调整服务器配置:合理设置服务器的最大并发连接数、线程池大小等参数,根据实际需求分配内存资源。
Java内存溢出的原因和解决⽅法你是否遇到过Java应⽤程序卡顿或突然崩溃的情况?您可能遇到过Java内存泄漏。
在本⽂中,我们将深⼊研究Java内存泄漏的确切原因,并推荐⼀些最好的⼯具来防⽌内存泄漏发⽣。
什么是JAVA内存泄漏?简单地说,Java内存泄漏是指对象不再被应⽤程序使⽤,⽽是在⼯作内存中处于活动状态。
在Java和⼤多数其他编程语⾔中,垃圾收集器的任务是删除不再被应⽤程序引⽤的对象。
如果不选中,这些对象将继续消耗系统内存,并最终导致崩溃。
有时java内存泄漏崩溃不会输出错误,但通常错误会以ng.OutOfMemoryErrorJAVA内存泄漏的原因是什么?当未被引⽤的对象被归类为引⽤对象时,就会导致Java内存泄漏。
这会阻⽌垃圾回收器清除内存,导致内存最终耗尽并崩溃。
在内存中,对象可以有两种状态,未引⽤和已引⽤。
被引⽤的对象仍然具有到Java应⽤程序的活动连接,⽽未被引⽤的对象则没有。
垃圾回收器的任务是查找和标识未引⽤的对象并将其删除。
垃圾回收器不会清理似乎被引⽤或正在使⽤的对象。
Java内存泄漏发⽣在未引⽤的对象重叠时,这些对象似乎仍在使⽤中。
我怎么知道是否有内存泄漏?有⼏种⽅法可以检查你的代码,看看它是否发⽣了内存泄漏。
识别泄漏的最简单⽅法是查找ng.OutOfMemoryError错误⽇志中的事件。
如果列出了此事件,您将能够提取有关Java的哪些部分导致了这种情况的进⼀步详细信息。
您经常会发现有关Java堆空间的详细信息。
这可能意味着内存泄漏,资源⽆法分配,或者堆⼤⼩设置得太低。
通常也会发现标记为PermGen空间的错误。
在⼤多数情况下,这不是内存泄漏,⽽是需要扩展的分配空间。
永久⽣成空间⽤于存储类对象,如果不扩展,则可以填充。
并不是所有的Java内存泄漏都是相同的,有些漏洞可以⽐其他漏洞更容易预防。
让我们来看看Java内存泄漏的⼀些最常见的原因。
如何防⽌JAVA内存泄漏最常见的内存泄漏类型之⼀是Java中的对象随着时间的推移⽽创建,但从未释放。
executorservice 线程池造成内存溢出解决方法内存溢出(OutOfMemoryError)通常是由于程序尝试使用的内存超过了Java虚拟机(JVM)的限制所致。
在使用`ExecutorService`和线程池时,可能存在一些常见的问题导致内存溢出。
以下是一些建议的解决方法:1. 合理配置线程池大小:-确保你的线程池大小合理。
如果创建了过多的线程,可能会导致内存溢出。
合理配置线程池的大小可以根据系统的硬件配置、可用内存和任务的性质。
2. 使用有界队列:-如果任务提交速度大于线程池处理速度,可能会导致内存溢出。
使用有界队列可以防止任务无限制地排队,从而保护系统不至于过载。
3. 考虑使用`ThreadPoolExecutor`的其他构造函数:- `ThreadPoolExecutor`有多个构造函数,允许你更详细地配置线程池。
你可以通过调整参数,例如`corePoolSize`、`maximumPoolSize`、`keepAliveTime`等来适应不同的需求。
4. 使用`ExecutorService`的`shutdown`方法:-确保在不需要线程池时调用`shutdown`方法来关闭线程池。
这可以确保线程池中的所有线程都被正确地关闭,释放相关资源。
```javaExecutorService executorService = Executors.newFixedThreadPool(10);// 在不再需要线程池时调用shutdownexecutorService.shutdown();```5. 处理任务异常:-如果你的任务中有可能抛出异常,确保在任务内部捕获并处理异常。
未处理的异常可能导致线程池中的线程意外终止,从而引发内存溢出。
6. 检查任务队列和线程池是否被正确关闭:-在应用程序生命周期结束时,确保线程池和相关资源被正确关闭。
这可以通过在适当的时候调用`shutdown`和`awaitTermination`来实现。
Java内存溢出的解决方法Java内存溢出的解决方法一、内存溢出类型JVM管理两种类型的内存,堆和非堆。
堆是给开发人员用的上面说的就是,是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。
它和堆不同,运行期内GC不会释放空间。
如果webapp用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web 服务器对JSP进行precompile的时候。
如果你的WEBAPP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
一个最佳的配置例子:(经过本人验证,自从用此配置之后,再未出现过tomcat死掉的情况)setJAVA_OPTS=-Xms800m-Xmx800m-XX:PermSize=128M-XX:MaxNewSize=256m-XX:MaxPermSize=256m2、ng.OutOfMemoryError:Javaheapspace注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
垃圾回收GC的角色JVM调用GC的频度还是很高的,主要两种情况下进行垃圾回收:当应用程序线程空闲;另一个是java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报outofmemory错误。
因为这个异常根据系统运行环境决定,所以无法预期它何时出现。
根据GC的机制,程序的运行会引起系统运行环境的变化,增加GC的触发机会。
为了避免这些问题,程序的设计和编写就应避免垃圾对象的内存占用和GC的开销。
显示调用System.GC()只能建议JVM需要在内存中对垃圾对象进行回收,但不是必须马上回收,一个是并不能解决内存资源耗空的'局面,另外也会增加GC的消耗。
二、JVM内存区域组成简单的说java中的堆和栈java把内存分两种:一种是栈内存,另一种是堆内存1。
在函数中定义的基本类型变量和对象的引用变量都在函数的栈内存中分配;2。
堆内存用来存放由new创建的对象和数组在函数(代码块)中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的内存空间;在堆中分配的内存由java虚拟机的自动垃圾回收器来管理堆的优势是可以动态分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的。
缺点就是要在运行时动态分配内存,存取速度较慢;栈的优势是存取速度比堆要快,缺点是存在栈中的数据大小与生存期必须是确定的无灵活性。
java堆分为三个区:New、Old和PermanentGC有两个线程:新创建的对象被分配到New区,当该区被填满时会被GC辅助线程移到Old区,当Old区也填满了会触发GC主线程遍历堆内存里的所有对象。
Old区的大小等于Xmx减去-Xmnjava栈存放栈调整:参数有+UseDefaultStackSize-Xss256K,表示每个线程可申请256k的栈空间每个线程都有他自己的Stack三、JVM如何设置虚拟内存提示:在JVM中如果98%的时间是用于GC且可用的Heapsize不足2%的时候将抛出此异常信息。
提示:HeapSize最大不要超过可用物理内存的80%,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值。
提示:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。
提示:假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。
简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了提示:注意:如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。
提示:设置NewSize、MaxNewSize相等,"new"的大小最好不要大于"old"的一半,原因是old区如果不够大会频繁的触发"主"GC,大大降低了性能JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
解决方法:手动设置Heapsize修改TOMCAT_HOME/bin/catalina.bat在“echo"UsingCATALINA_BASE:$CATALINA_BASE"”上面加入以下行:JAVA_OPTS="-server-Xms800m-Xmx800m-XX:MaxNewSize=256m"四、性能检查工具使用定位内存泄漏:JProfiler工具主要用于检查和跟踪系统(限于Java开发的)的性能。
JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。
1.应用服务器内存长期不合理占用,内存经常处于高位占用,很难回收到低位;2.应用服务器极为不稳定,几乎每两天重新启动一次,有时甚至每天重新启动一次;3.应用服务器经常做FullGC(GarbageCollection),而且时间很长,大约需要30-40秒,应用服务器在做FullGC的时候是不响应客户的交易请求的,非常影响系统性能。
因为开发环境和产品环境会有不同,导致该问题发生有时会在产品环境中发生,通常可以使用工具跟踪系统的内存使用情况,在有些个别情况下或许某个时刻确实是使用了大量内存导致outofmemory,这时应继续跟踪看接下来是否会有下降,如果一直居高不下这肯定就因为程序的原因导致内存泄漏。
五、不健壮代码的特征及解决办法1、尽早释放无用对象的引用。
好的办法是使用临时变量的时候,让引用变量在退出活动域后,自动设置为null,暗示垃圾收集器来收集该对象,防止发生内存泄露。
对于仍然有指针指向的实例,jvm就不会回收该资源,因为垃圾回收会将值为null的对象作为垃圾,提高GC回收机制效率;2、我们的程序里不可避免大量使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域;Stringstr="aaa";Stringstr2="bbb";Stringstr3=str+str2;//假如执行此次之后str,str2以后再不被调用,那它就会被放在内存中等待Java的gc去回收,程序内过多的出现这样的情况就会报上面的那个错误,建议在使用字符串时能使用StringBuffer就不要用String,这样可以省不少开销;3、尽量少用静态变量,因为静态变量是全局的,GC不会回收的;4、避免集中创建对象尤其是大对象,JVM会突然需要大量内存,这时必然会触发GC优化系统内存环境;显示的声明数组空间,而且申请数量还极大。
这是一个案例想定供大家警戒使用jspsmartUpload作文件上传,运行过程中经常出现java.outofMemoryError的错误,检查之后发现问题:组件里的代码m_totalBytes=m_request.getContentLength();m_binArray=newbyte[m_totalBytes];问题原因是totalBytes这个变量得到的数极大,导致该数组分配了很多内存空间,而且该数组不能及时释放。
解决办法只能换一种更合适的办法,至少是不会引发outofMemoryError的方式解决。
5、尽量运用对象池技术以提高系统性能;生命周期长的对象拥有生命周期短的对象时容易引发内存泄漏,例如大集合对象拥有大数据量的业务对象的时候,可以考虑分块进行处理,然后解决一块释放一块的策略。
6、不要在经常调用的方法中创建对象,尤其是忌讳在循环中创建对象。
可以适当的使用hashtable,vector创建一组对象容器,然后从容器中去取那些对象,而不用每次new之后又丢弃7、一般都是发生在开启大型文件或跟数据库一次拿了太多的数据,造成OutOfMemoryError的状况,这时就大概要计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。