`

java 内存溢出 栈溢出的原因与排查方法

 
阅读更多

 1、 内存溢出的原因是什么?

 

      内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查:

 

    一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串。如public static int i = 0; //public static String str;

 

  二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象)

 

  三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象)

 

  四)检查App中是否使用了向数据库查询所有记录的方法。即一次性全部查询的方法,如果数据量超过10万多条了,就可能会造成内存溢出。所以在查询时应采用“分页查询”。

 

  五)检查是否有数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会让对应的对象不能被释放。会大量存储在内存中。

 

  六)检查是否使用了“非字面量字符串进行+”的操作。因为String类的内容是不可变的,每次运行"+"就会产生新的对象,如果过多会造成新String对象过多,从而导致JVM没有及时回收而出现内存溢出。

 

   如String s1 = "My name";

       String s2 = "is";

       String s3 = "xuwei";

      String str = s1 + s2 + s3 +.........;这是会容易造成内存溢出的

 

     但是String str =  "My name" + " is " + " xuwei" + " nice " + " to " + " meet you"; //但是这种就不会造成内存溢出。因为这是”字面量字符串“,在运行"+"时就会在编译期间运行好。不会按照JVM来执行的。

 

   在使用String,StringBuffer,StringBuilder时,如果是字面量字符串进行"+"时,应选用String性能更好;如果是String类进行"+"时,在不考虑线程安全时,应选用StringBuilder性能更好。

 

  七)使用 DDMS工具进行查找内存溢出的大概位置

2、栈溢出的原因

 

     一)、是否有递归调用

 

    二)、是否有大量循环或死循环

 

   三)、全局变量是否过多

 

   四)、 数组、List、map数据是否过大

 

   五)使用DDMS工具进行查找大概出现栈溢出的位置

分享到:
评论

相关推荐

    JAVA内存溢出问题总结

    JAVA内存溢出问题总结 JAVA 内存溢出问题是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用的内存大于虚拟机能提供的最大内存。内存溢出问题可以从容器和程序类两个方面进行排查,容器问题...

    java内存泄露、溢出检查方法和工具

    本文将深入探讨如何检测和分析Java内存泄露与溢出,并介绍一种常用的工具——Memory Analyzer(MAT)。 首先,理解内存泄露的概念至关重要。在Java中,内存泄露通常发生在对象不再被程序使用但仍然保持在内存中,...

    java 内存溢出分析工具 HeapAnalyzer

    - 理解Java内存模型(堆、栈、方法区等)对使用内存分析工具至关重要。 总之,HeapAnalyzer是Java开发者处理内存溢出问题的强大助手。通过熟练掌握其使用,我们可以有效地定位并解决内存问题,提升应用的稳定性和...

    java内存溢出原因

    在排查内存溢出问题时,应结合日志分析、业务逻辑审查、代码审查和性能监控工具,以确定内存泄漏的源头,并针对性地优化代码和调整内存配置。对于复杂的情况,可能需要通过模拟复现问题场景,采用排除法逐步缩小问题...

    内存溢出配置,内存溢出配置

    接下来,我们将深入探讨与内存溢出配置相关的几个关键知识点。 ### 1. 内存溢出的概念 内存溢出是指程序运行时,申请的内存空间超过了系统能够提供的最大值,导致程序无法继续执行下去的现象。在Java中,主要分为...

    java IBM websphere 内存溢出 javacore deapdump CPU内存分析工具

    2. 非堆内存:包括JVM自身使用的内存(如方法区、元空间)和线程栈,这部分内存也可能导致溢出。 3. GC(Garbage Collection):Java的自动内存管理机制,如果GC无法有效地回收不再使用的对象,可能导致内存泄漏。 4...

    JVM实战-对象访问与内存溢出异常解析

    1. **理解内存区域与内存区域异常**:学习JVM的内存结构,包括程序计数器、Java堆、虚拟机栈、本地方法栈、方法区和运行时常量池等,并了解它们发生异常的原因。 2. **掌握Java堆内存溢出异常的测试**:通过编写...

    解决tomcat内存溢出的配置方法

    2. **设置PermGen或Metaspace大小**:在Java 8以前, PermGen是存放类和方法的元数据区域,经常引发内存溢出。在Java 8及以后版本,这部分被替换为Metaspace。同样,我们可以通过`-XX:MaxMetaspaceSize`来设置最大元...

    java内存泄露、溢出检查方法和工具.pdf

    Java内存管理和内存问题,特别是内存泄露与内存溢出,是Java开发者必须面对的重要主题。本文主要探讨了Java内存溢出的检查方法和工具,以及内存泄露的基本原理。 首先,当Java应用程序抛出`java.lang....

    Java的内存管理机制分析

    - 栈内存中的数据在方法执行完毕后会自动释放,因此栈内存的生命周期与方法的执行周期一致。 2. **堆(Heap)**: - 是Java虚拟机中最大的内存区域。 - 存储通过`new`操作符创建的对象实例。 - 堆内存是所有...

    idea git提交内存溢出后dump文件

    标题中的“idea git提交内存溢出后dump文件”指的是在使用IntelliJ IDEA(简称IDEA)这款流行的Java集成开发环境进行Git操作时遇到了内存溢出的问题,导致系统生成了一个名为`heapDump.hprof`的堆转储文件。内存溢出...

    使用MAT分析Tomcat内存溢出

    内存溢出问题的排查和解决是一项重要的技能。本文将详细讲解如何使用Memory Analyzer Tool (MAT) 这款强大的工具来分析Tomcat的内存溢出问题。 MAT是IBM开发的一款专门用于分析Java heap dump的工具,它可以帮助...

    关于java堆内存溢出的几种情况

    Java堆内存溢出是应用程序运行过程中常见的问题,可能导致系统崩溃或者性能急剧下降。本文将详细介绍几种常见的Java堆内存溢出情况及其解决方案。 【情况一】:`java.lang.OutOfMemoryError: Java heap space` 这是...

    内存溢出是什么意思?.docx

    内存溢出是指在Java虚拟机(JVM)中,因为内存不足或内存泄露而导致的错误。内存溢出可能会导致程序崩溃、异常、卡死甚至服务器宕机等严重问题。因此,了解内存溢出的原因和解决方案非常重要。 内存溢出的原因有很...

    JAVA内存泄漏分析工具

    总的来说,JAVA内存泄漏分析工具,尤其是MAT,是Java开发者必备的诊断利器,它能够帮助我们高效地排查和解决内存相关问题,确保应用程序的稳定性和性能。通过熟练掌握这类工具的使用,开发者可以更好地优化代码,...

    jvm分析工具JProfiler,java应用内存溢出堆栈快照分析工具

    当Java应用出现内存溢出问题时,JProfiler可以生成堆栈快照,这有助于分析导致内存溢出的具体原因。通过堆栈快照,开发者可以看到对象的引用链,找出持有大对象的根源,以便进行针对性的优化。 **5. 线程监控** ...

    关于内存溢出导致的服务器崩溃问题分享

    本文将分享关于内存溢出导致的服务器崩溃问题,包括问题现象、问题排查、问题分析、问题原因、什么是内存溢出、内存溢出可能的原因、相关总结等内容。 问题现象: 在生产环境中,服务器的CPU经常飙升至700%、800%,...

    JavaSE基础篇 -- jdk配置,数组及其应用,栈和堆内存图解(Java源码)

    这种图解对于理解和排查内存泄漏、栈溢出等问题十分有帮助。 总之,JavaSE基础学习涉及的内容广泛,从JDK的配置到数组的使用,再到内存模型的理解,都是成为一名合格Java开发者必备的基础。通过实际的代码示例和...

    内存溢出及锁表问题的分析与解决.doc

    内存溢出及锁表问题的分析与解决 内存溢出及锁表问题是开发人员最常见的噩梦之一,它们的出现往往不知道是在什么时候或是在什么操作步骤上出现的,根据堆栈信息也很难定位到程序中是某处出现了问题。今天,我们将对...

Global site tag (gtag.js) - Google Analytics