当前遇到的问题
一个老项目
一个可能比我还要年长的.jar 包
一个不明觉厉的类
请问遇到这种情况怎么防止内存溢出?
Test t=new Test(); t.start(); //没有找到关闭以及释放资源的方法
1 securityCoding 2020-09-15 10:56:38 +08:00 创建一个相同路径的类,覆盖掉它 |
2 dijia478 2020-09-15 11:00:57 +08:00 内存溢出?看楼主贴的代码,应该是内存泄漏导致的吧,做好高可用,然后定时重启服务。庞大的系统都是通过这种方式解决的。 |
![]() | 3 youla OP @securityCoding 这个类里面本身就 new 了很多类,也适用吗! |
![]() | 5 wande6 2020-09-15 11:28:02 +08:00 使用钞能力,加硬件怼 |
![]() | 6 dovme 2020-09-15 12:42:23 +08:00 加内存,加到它泄漏 100 年内存都用不完,不就好了? |
![]() | 7 lewis89 2020-09-15 12:56:48 +08:00 上集群副本啊,溢出重启让其它的副本顶上.. |
![]() | 8 nomansky 2020-09-15 12:58:11 +08:00 via iPhone 这不是叫内存泄露么…gc 回收不了就只能重启了 |
9 THESDZ 2020-09-15 14:09:58 +08:00 多副本,滚动重启 |
![]() | 10 fhsan 2020-09-15 14:29:27 +08:00 多个副本,监控自动重启,加内存加机器根本不可取 |
![]() | 12 kingfalse 2020-09-15 16:37:28 +08:00 1 》 sh 脚本里面写个死循环执行 java -jar , 2 》程序里面 new Thread 然后 sleep 一个小时,然后 exit 反正就是等他内存崩之前,你先自杀重启,完美符合题意. 手动狗头保命 /doge/doge/doge |
13 Marine5174 2020-09-15 17:16:27 +08:00 LZ dump heap 了吗? 确定是这个类泄漏造成的内存溢出吗? |
14 securityCoding 2020-09-15 17:17:58 +08:00 @youla 直接上字节码增强吧 , 实现原理参考一下 arthas 源码 |
![]() | 15 youla OP @Marine5174 我确定!我在寻找一个解决办法,希望能找到或者记录这个类从实例化到调用产生出来的新事物,然后结束时一并释放。 |
18 THESDZ 2020-09-15 17:43:15 +08:00 那就把这个内部改为线程池,限制他的内存,改造会导致什么问题,得看具体代码和业务 |
![]() | 20 araaaa 2020-09-15 18:38:36 +08:00 via iPhone 定时重启 |
21 ic2y 2020-09-15 18:46:07 +08:00 @youla 在启动脚本里,加上 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/heap/java.dump 然后运行一把程序,让他内存溢出崩溃。 然后用 MAT 软件分析 /path/heap/java.dump 文件,看看是谁导致了溢出,修正之,再往复循环测试。 直到不崩溃。 |
22 neoblackcap 2020-09-15 21:08:25 +08:00 @youla 你说不用规避的手段,那就是你去修掉内存泄漏的 bug 。否则所有方法都是规避手段。 |
23 whp1473 2020-09-16 16:57:12 +08:00 首先你确定是这个类造成的么? 第一、Test t=new Test(); t.start();创建后方法出栈就会判定为可回收了,gc 会自动垃圾回收。如果不确定,用 JVM VisualVM 分析 dump 日志,找到堆中最多的类,分析为什么该类被一直持有 第二、Test t=new Test(); t.start();如果是一个线程,一直运行,那说明里面有 while 死循环,并一直持有对象的地址和一直 new 对象导致,也可能是阻塞导致对象不被释放,比如 Http 不设置超时时间等。如果是古老的包,可以考虑继承、代理模式、AOP 等方式替换接口实现,来修复该 BUG 。 第三、如果都没有问题,Test 就是每个用户请求就要有一个,那建议加大 JVM 堆内存,同时使用更好的机器,以及对机器限流和用 ng 做复杂均衡,将请求均匀分布在更多的机器上 |
![]() | 24 youla OP @whp1473 你好,我也不太熟悉 Java,这个类里面可能封装了 io 包里面的一些类没有及时 close,想请教下这种情况会回收吗? |