
正文
堆溢出java代码 堆内存溢出代码
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java堆栈溢出的机制与原理
Java堆栈溢出的出现 很让人痛苦的事情 很多时候都无法找到头绪 这里作者通过使用jrockit调用程序才最终发现了问题的所在 在很多情况下 Java堆栈溢出 很有可能是你的代码中用到数组 到你的索引超出范围了
java lang OutOfMemoryError: Java heap space
在Java程序运行中可能会报如上的错误 通常是在运行过程中内存占用了没有别释放造成的
以前可能没法跟踪可能是很痛苦的事情 现在好了 我们有一个调试软件可以用了 在生产环境下使用的jRockit软件进行调试 是Oracle公司出品的
前两天试用了一下真的很不错
前阵子有个程序跑 个礼拜左右就会出现Java堆栈溢出 始终找不到头绪 后来使用jrockit才找到问题的出处
jrockit是可以调试远程程序也可以调试本地程序的
具体调试步骤
(一)
如果是调试本地程序的话 启动jrockit 然后启动本地需要调试的程序 会在左侧工具栏 本地目录下创建一个连接为需要调试的程序 在上面点击右键 就会启动跟踪
如何跟踪呢 我的办法就是等 在跟踪开始后 进行截图 然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量
(二)
然后在上面点击右键 显示分配跟踪
(三)
然后找到对应的方法 然后就去找问题吧 看看是不是那个地方有内存一直没有释放啊
然后说点我自己的小经验 也许是不对的 但是我在我的应用里面确实是有效的
在经常需要调用的地方将变量设成全局的甚至是静态的 我的操作是设成全局的了 图省事呢 呵呵 因为我的变量时全局都要调用的而且是频繁调用的
用完的变量一定要记得让它等于null 否则执行gc()貌似是不给回收的
基本上jrockit跟踪是很强的 都能够找到你的问题所在 要仔细观察 改完程序后记得再重新跟踪下直到没有内存泄露为止
写完手工
lishixinzhi/Article/program/Java/hx/201311/26094
相关问答
Q1: java程序堆内存溢出错误如何解决?
把eclipse的内存调大一点,在eclipse的目录下面有一个eclipse.ini文件,打开调一下-XX:MaxPermSize=250m的大小!除了这点以外,如果你的代码写的有问题,那就是需要你自己改下代码的!
Q2: java怎么检查程序内存溢出
java程序大家都知道堆溢出java代码,内存溢出是经常见堆溢出java代码的错误,下面从基本的开始分析堆溢出java代码!
内存溢出是由于没被引用的对象(垃圾)过多造成JVM没有及时回收,造成的内存溢出。如果出现这种现象可行代码排查堆溢出java代码:
一)是否App中的类中和引用变量过多使用堆溢出java代码了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性能更好。
知道原因了,解决起来就非常简单了。
Q3: java内存溢出怎么解决?
第一对所有的代码包括页面中的java代码都进行一遍彻底的回顾检查,
1.对那些静态(static)的对象要特别留神,特别是类型为Map,List,Set的,静态的变量会一直驻存在内存中,生命周期比较长,不会被垃圾器回收。
2.对于代码,要审查是否生成了大量的冗余的对象,还有一些逻辑业务处理的类,
算法是否过于复杂,调整算法,对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。
3.Java中的内存溢出大都是因为栈中的变量太多了。其实内存有的是。建议不用的尽量设成null以便回收,多用局部变量,少用成员变量。
1),变量所包含的对象体积较大,占用内存较多。
2),变量所包含的对象生命周期较长。
3),变量所包含的对象数据稳定。
4),该类的对象实例有对该变量所包含的对象的共享需求。
4.在我的程序中对静态变量的优化后,使程序占用内存量至少提升了5k-10k。所以也不容忽视。
第二还有就是String类相关的东西:
1.字符串累加的时候一定要用StringBuffer的append方法,不要使用+操作符连接两个字符串。差别很大。而且在循环或某些重复执行的动作中不要去创建String对象,因为String对象是要用StringBuffer对象来处理的,一个String对象应该是产生了 3个对象(大概是这样:))。
2.字符串length()方法来取得字符串长度的时候不要把length放到循环中,可以在循环外面对其取值。(包括vector的size方法)。特别是循环次数多的时候,尽量把length放到循环外面。
int size = xmlVector.size();
for (int i = 2; i size; i++) {
。。。
}
3 写代码的时候处理内存溢出
try{
//do sth
....
}catch (outofmemoryerror e){//可以用一个共通函数来执行.
system.out.print (“no memory! ”);
system.gc();
//do sth again
....
} 4.对于频繁申请内存和释放内存的操作,还是自己控制一下比较好,但是System.gc()的方法不一定适用,最好使用finallize强制执行或者写自己的finallize方法。 Java 中并不保证每次调用该方法就一定能够启动垃圾收集,它只不过会向JVM发出这样一个申请,到底是否真正执行垃圾收集,一切都是个未知数。
堆溢出java代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于堆内存溢出代码、堆溢出java代码的信息别忘了在本站进行查找喔。






