`

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内存泄露、溢出检查方法和工具。 步骤: 1,使用linux命令生存堆栈文件 2,用MemoryAnalyzer.exe工具打开 3,根据工具生成的饼状图可以清晰的找出内存泄漏源

    Java内存溢出及分析

     java内存有几种:程序计数器,虚拟机栈,方法常量区,堆,本地方法栈,直接内存。既然分析内存溢出,那从这几种内存逐一分析。  1,程序计数器:是一个较小的内存空间,是但钱线程的字节码行号指示器,这个不会...

    Java的内存管理机制分析

    Java的内存管理机制分析 让你了解java的内存管理 以及如何去分析它

    JAVA内存泄漏分析工具

    该工具用来排查线上程序出现内存泄漏或溢出,死锁等相关问题,快速分析堆栈异常情况,找到问题代码进行修复。

    jvm问题排查

    jvm问题排查的一个工具手册

    如何利用 JConsole观察分析Java程序的运行,进行排错调优

    从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 ...

    java 垃圾回收 机制详解

    经过半个世纪的发展,内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那为什么我们还要去了解GC和内存分配呢?答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为...

    高级开发jvm面试题和答案.pdf

    面试高级开发的期间整理的面试题目,记录我面试遇到过的jvm...简述一下内存溢出的原因,如何排查线上问题? 内存溢出的原因 引用在gc中回收状况 为什么gc停止所有进程; 有几种垃圾回收器; 描述一下CMS和G1的异同;

    Java进阶教程解密JVM视频教程

    * 在内存结构章节,能够学习掌握 JVM内存溢出现象,堆栈内存结构,利用内存诊断工具排查问题。彻底分析 StringTable的相关知识与性能优化,掌握直接内存分配原理和释放手段。 * 在垃圾回收章节,不仅会介绍垃圾回收...

    【JVM和性能优化】1.Java内存区域

    文章目录了解的必要性JVM历史JVM数据区域私有区共有区内存区域版本变化1.61.71.8元空间栈跟堆Java中的对象都是在堆中分配吗逃逸分析标量替换栈上分配同步消除JVM对象对象创建过程对象内存布局对象访问方式通过句柄...

    Java Web开发常见问题.docx

    内存溢出问题:在Java Web开发中,当应用程序处理大量数据或访问大量对象时,可能会出现内存溢出问题。这通常是由于内存泄漏或程序中使用了过多的内存资源导致的。 线程安全问题:在多线程环境下,Java Web应用程序...

    游戏画面就弹出内存不能为read修复工具

    内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中“安装”的病毒程序),更改了大量的系统参数和系统...

    JAVA性能优化,让程序更快更稳定!

    本文主要通过分析云系统遭遇的java进程内存溢出的问题,介绍java进程占用系统内存高时的排查方案及建议的解决方案,同时延伸拓展java进程占用系统内存高的原因以及对于linux操作系统的内存管理和优化方案。...

    Arthas阿尔萨斯使用说明

    阿里的Arthas的使用说明精简版, 对常用的Java程序的监控、排查内存溢出问题等, 有较好的指导作用,希望对大家有帮助

    Java虚拟机筑地篇之垃圾收集算法

    答案很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 之前了解到内存运行时区域的各个部分,其中程序计数器...

    MemoryAnalyzer-1.12.0.20210602-win32.win32.x86-64.zip

    资源名称:Eclipse Memory...Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。 这个版本是支持jdk11的,上一个1.11的版本是jdk1.8的。收大家分就是因为下载比较难搞。

    StackoverflowJavaAnswers:在这里,我将添加我对需要可运行的 java 示例用于计算器溢出的问题的未来答案

    MySQL Minecraft Bukkit 错误,因为没有正确执行 - 带键的 Gson 字符串 - Gson 生成 json - 使用 Gson 从 JSON 数组中排除空对象 - 使用 DecimalFormat 舍入 2 个小数位 - 使用默认语言环境无法在 Java 中调用方法 ...

    MemoryAnalyzer-1.11.0.20201202-win32.win32.x86-64.zip

    Eclipse Memory Analyzer是一个快速而功能丰富的Java堆分析器,可帮助您查找内存泄漏并减少内存消耗。 这个版本是支持jdk1.8的,下一个1.12版本直接是jdk11起步了。收大家分就是因为下载比较难搞。

    JVM垃圾回收及监控优化1

    介绍一下CMS,G1收集器。本文导线当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。1

Global site tag (gtag.js) - Google Analytics