浏览 963 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-07-10 关键字: java内存溢出
相信大家在开发过程中一定碰到过内存溢出的情况。
关于解决方案有如下一些: 1.查找程序bug找出内存泄漏的地方 2.引用的包有内存溢出的缺陷或有冲突 3.病毒引起杀毒 4.打补丁 5.优化程序 6.加大堆栈大小 7.加内存 但是即使使用了上述方法仍然有可能会遇到内存溢出的情况,比如说机器总共能存2g,随着访问量的增加,内存总有可能会不够的,这时java垃圾回收机制就会开始回收内存,当回收了也不够时,java进程就会崩掉。 大家是如何防止或者处理这种情况的发生的呢? 比如说以前做windows应用程序有一个可以拦截程序异常的api可以在程序崩掉后拦截到并重启程序,但是java中该怎么做呢,或者有没有其他方法? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
设计请求队列,在同一时间,只能有若干个请求能被处理,其它的请求处于等待状态
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
首先确定一下你的应用内存参数是否设置了。
可以通过java 的内存泄漏工具查看一下是否有对象只增长不减少的。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
hrtc 写道 但是即使使用了上述方法仍然有可能会遇到内存溢出的情况,比如说机器总共能存2g,随着访问量的增加,内存总有可能会不够的,这时java垃圾回收机制就会开始回收内存,当回收了也不够时,java进程就会崩掉。 这个说的不对。访问量增加内存不应当会当然的增加(这里考虑的是不可回收的内存),除非存在内存泄露,否则应当是幂等的,即访问多少次都一样。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
我说的是极端的情况,就是假设内存中的所有数据都被引用着而无法释放导致内存溢出,这时该怎么办,我目前想到的是做个守护进程(当java崩掉后重启服务),但不知道java中如何实现,二楼的思路不错,限制访问量直接防止该情况发生。
另外想问下有没有办法让java强制回收有引用的对象,这样应该可以解决问题,另外看到《强烈推荐:著名社交网站LinkedIn的Java架构技术这篇文章里》(http://www.javaeye.com/news/2494)这段话: 8。缓存通过C++实现,用JNI调用,LinkedIn选择C++而不是Java有两个原因: 1)尽可能的减少RAM的使用 2)垃圾收集暂停会杀死整个系统,LinkedIn用了最新的GC程序 难道一定要自己重写垃圾回收? |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
hrtc 写道 我说的是极端的情况,就是假设内存中的所有数据都被引用着而无法释放导致内存溢出,这时该怎么办,我目前想到的是做个守护进程(当java崩掉后重启服务),但不知道java中如何实现
要在完蛋时做点事的话,可以: java -XX:OnError=”userdump.exe %p” MyApplication 把那个userdump.exe换成你写的某个.bat程序。这样当java程序因error而退出时,会先调用这个脚本,而后,这个脚又再次运行程序。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
补充一下, -XX:OnError 是SUN的JVM有的参数,其它的JVM不知道有没有,你得查一查啦。
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-10
用监控程序来做更好,让监控程序来处理没有响应或者响应不正常的server
加大内存或者通过修改内存参数只可以改善运行环境,对OOM错误没有太大帮助,除非你确定OOM错误不是程序bug造成的 查找程序bug找出内存泄漏的地方是解决OOM的第一步 同时对内存使用做优化也是很必要的 以前做cach,用到ArrayList,没有考虑到数据的可能大小,在添加到一定量的数据后就OOM,ArrayList在增长的时候默认是double size的,而且是Array,连续内存很容易导致无法分配,这样的OOM最麻烦 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-15
看看你的程序出是不是出现下列情况:
1.程序与数据库交互的次数是不是太多 2.临时的变量用完时是否及时销毁,因为即使是垃圾回收也会过一段时间才会收集这些临时变量。 3.看看你的程序中是否出现在调用一些无用的属性。特别是与数据库交互的时候。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-15
内存溢出还有一种可能是线程太多任务太复杂,导致CPU消耗太高,GC线程一直wait得不到执行。在IBM虚拟机下更容易遇到
|
|
| 返回顶楼 | |







