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工具进行查找大概出现栈溢出的位置

已有 0 人发表留言,猛击->> 这里 <<-参与讨论

ITeye推荐

相关 [java 内存 溢出] 推荐:

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

- - 互联网 - ITeye博客

1、 内存溢出的原因是什么.       内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出. 如果出现这种现象可行代码排查:.     一)是否App中的类中和引用变量过多使用了Static修饰 如public staitc Student s;在类中的属性中使用 static修饰的最好只用基本类型或字符串. 如public static int i = 0; //public static String str;.   二)是否App中使用了大量的递归或无限递归(递归中用到了大量的建新的对象).   三)是否App中使用了大量循环或死循环(循环中用到了大量的新建的对象).

Java内存溢出问题的定位过程

- - Java - 编程语言 - ITeye博客

相信通过写java程序讨生活的人对内存溢出并不陌生,如下文字的出现更是让人恼火:. 尤其当应用服务器(Java容器)出现上述情况更是让人有一种天塌下来的感觉.    好的编码实践可能会大大降低内存溢出的产生.    本文并不是写如何规避内存溢出,但是我还是要介绍一下如何能够尽量规避内存溢出:. 找几个资深程序猿(或者整个项目组讨论后)写一个Java编码规范,让项目组成员尽量遵守. 一目了然的代码更容易定位问题,当然也更能让人写出好的代码. 单元测试要覆盖所有分支与边界条件. 有句老话说常在河边站哪有不湿鞋(学名墨菲定律). 代码写完了,找资深程序猿扫扫代码没有坏处. 有条件的项目组要充分利用测试人员的能动性.

译文:解密Java内存溢出之持久代

- - 研发管理 - ITeye博客

垃圾回收是Java程序员了解最少的一部分. 他们认为Java虚拟机接管了垃圾回收,因此没必要去担心内存的申请,分配等问题. 但是随着应用越来越复杂,垃圾回收也越来越复杂,一旦垃圾回收变的复杂,应用的性能将会大打折扣. 所以,Java程序员了解垃圾回收的机制并且知道怎样解决“内存溢出”问题会有很大的益处. 在Java中,有两个非常普遍的内存溢出问题. 一个是堆内存溢出,另一个是持久代内存溢出.        Java对象是java 类的实例. 每当创建一个Java对象时,Java虚拟机都会创建该对象的内部引用并且保存在堆中. 如果一个类是第一次访问,那么它必须通过Java虚拟机加载进来.

使用JProfiler解决Java应用程序内存溢出问题实例

- - Java - 编程语言 - ITeye博客

前段时间基于OpenJms部署了一个消息中间件服务器,通过主题订阅模式在各个消息节点之间传递信息,但是某个类型的消息节点长时间运行后出现了内存溢出问题,最后使用JProfiler的基本线程监测功能找到问题所在,并且进行解决. Java 版本 java version "1.7.0_40". JProfiler 版本 v8.0.7. 1、 打开JProfiler,选择New Session. 2、 点击Attach,按ok,以便从本地JVM中选择正在运行的java程序. 3、 选择session,这里可以看到本机运行的所有java程序,我的应用ID为844,因此,选择844,点击ok.

Android 内存溢出解决方案(OOM)

- - CSDN博客移动开发推荐文章

众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定). 因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片、音频文件、视频文件等多媒体资源;由于Android系统对音频、视频等资源做了边解析便播放的处理,使用时并不会把整个文件加载到内存中,一般不会出现内存溢出(以下简称OOM)的错误,因此它们的内存消耗问题暂不在本文的讨论范围. 本文重点讨论的是图片的内存消耗问题,如果你要开发的是一款图片浏览器应用,例如像Android系统自带的Gallery那样的应用,这个问题将变得尤为突出;如果你开发的是目前的购物客户端,有时候处理不当也会碰到这种问题.

perftools查看堆外内存并解决hbase内存溢出

- d0ngd0ng - 蓝色时分

最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g. 堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪:.     它的原理是在java应用程序运行时,当调用malloc时换用它的libtcmalloc.so,这样就能做一些统计了. 下载http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-beta.tar.gz,configure;make;sudo make install. 下载http://google-perftools.googlecode.com/files/google-perftools-1.8.1.tar.gz, configure --prefix=/home/user/perftools;make;sudo make install.

深入了解JVM笔记(1)—内存区域与内存溢出异常

- - 博客园_首页

在前面的几篇博文中,我们一起简单的了解jvm的基本知识,例如jvm对字符串的处理等等,或许大家看完后就把这当成一条准则来记住了,但是一些比较好奇的朋友有没有想过,这是为什么呢. 下面就让我们开始一步一步的深入学习. 在这篇博文中呢,我打算主要就讲Java内存区域与内存溢出异常吧. 1.Java虚拟机运行时数据区. 在前面的几篇博文中,我们只是简单的把内存区域分为了堆和栈,但其实,这种分法是十分粗糙的,jvm在实际运行的时候,内存区域的划分绝对不是那么简简单单的就两块,我们一起看下面这个图就知道了. 从上图我们知道了,JVM虚拟机运行时数据区主要划分为:方法区、虚拟机栈、本地方法栈、堆、程序计数器.

JVM内存分析系列(二)内存溢出的类型分析

- - 企业架构 - ITeye博客

package com.chinaso.phl; import java.lang.reflect.Field; /** * @author piaohailin * @date 2013-12-24 */ public class Server {. //2 虚拟机栈和本地方法栈溢出. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

OOM分析——错误使用Servlet API导致内存溢出

- - 开涛的博客

请先前往《 Spring内存溢出问题》查看问题,大体问题就是突然间内存飙升,且CPU使用率非常高. 通过内存dump分析发现内存中某个key会有几百万个,而且观察这些key会发现有时候是org.springframework.web.servlet.DispatcherServlet.LOCALE_RESOLVER,有时候又变成org.springframework.web.servlet.DispatcherServlet.THEME_RESOLVER,每次可能不一样. 这个key是springmvc放到request中的属性key,而且一个key不可能放到request多次啊,因为request attributes本身通过HashMap存储,且线程不安全;造成这个问题的能想到的就是线程绑定变量泄露/并发操作request.

一次使用Eclipse Memory Analyzer分析Tomcat内存溢出

- -

在平时开发、测试过程中、甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题. 我们需要找造成OutOfMemoryError原因. 1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收,通过找出泄露的代码位置和原因,才好确定解决方案;. 2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况. 以上是处理Java堆问题的思路,具体是怎么进行分析,这里介绍的是使用Eclipse Memory Analyzer tool(MAT)工具分析的过程.


转自:http://www.tuicool.com/articles/EJJ7re

阅读更多

没有更多推荐了,返回首页