请问 Java 怎么防止内存溢出? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
youla
V2EX    Java

请问 Java 怎么防止内存溢出?

  •  
  •   youla 2020-09-15 10:54:06 +08:00 4937 次点击
    这是一个创建于 1859 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 当前遇到的问题

      • 一个老项目

      • 一个可能比我还要年长的.jar 包

      • 一个不明觉厉的类

    请问遇到这种情况怎么防止内存溢出?

    Test t=new Test(); t.start(); //没有找到关闭以及释放资源的方法 
    26 条回复    2020-09-17 15:55:28 +08:00
    securityCoding
        1
    securityCoding  
       2020-09-15 10:56:38 +08:00
    创建一个相同路径的类,覆盖掉它
    dijia478
        2
    dijia478  
       2020-09-15 11:00:57 +08:00
    内存溢出?看楼主贴的代码,应该是内存泄漏导致的吧,做好高可用,然后定时重启服务。庞大的系统都是通过这种方式解决的。
    youla
        3
    youla  
    OP
       2020-09-15 11:01:31 +08:00
    @securityCoding 这个类里面本身就 new 了很多类,也适用吗!
    youla
        4
    youla  
    OP
       2020-09-15 11:05:25 +08:00
    @dijia478 不让重启,要 24 小时运行,崩溃,是监控。。
    wande6
        5
    wande6  
       2020-09-15 11:28:02 +08:00
    使用钞能力,加硬件怼
    dovme
        6
    dovme  
       2020-09-15 12:42:23 +08:00
    加内存,加到它泄漏 100 年内存都用不完,不就好了?
    lewis89
        7
    lewis89  
       2020-09-15 12:56:48 +08:00
    上集群副本啊,溢出重启让其它的副本顶上..
    nomansky
        8
    nomansky  
       2020-09-15 12:58:11 +08:00 via iPhone
    这不是叫内存泄露么…gc 回收不了就只能重启了
    THESDZ
        9
    THESDZ  
       2020-09-15 14:09:58 +08:00
    多副本,滚动重启
    fhsan
        10
    fhsan  
       2020-09-15 14:29:27 +08:00
    多个副本,监控自动重启,加内存加机器根本不可取
    hecz
        11
    hecz  
       2020-09-15 15:34:40 +08:00
    @youla 分批部署都不行?
    kingfalse
        12
    kingfalse  
       2020-09-15 16:37:28 +08:00
    1 》 sh 脚本里面写个死循环执行 java -jar ,
    2 》程序里面 new Thread 然后 sleep 一个小时,然后 exit

    反正就是等他内存崩之前,你先自杀重启,完美符合题意.
    手动狗头保命 /doge/doge/doge
    Marine5174
        13
    Marine5174  
       2020-09-15 17:16:27 +08:00
    LZ dump heap 了吗? 确定是这个类泄漏造成的内存溢出吗?
    securityCoding
        14
    securityCoding  
       2020-09-15 17:17:58 +08:00
    @youla 直接上字节码增强吧 , 实现原理参考一下 arthas 源码
    youla
        15
    youla  
    OP
       2020-09-15 17:21:15 +08:00
    @Marine5174 我确定!我在寻找一个解决办法,希望能找到或者记录这个类从实例化到调用产生出来的新事物,然后结束时一并释放。
    youla
        16
    youla  
    OP
       2020-09-15 17:22:38 +08:00
    @fhsan
    @THESDZ
    @lewis89 不用规避的手段!!
    lewis89
        17
    lewis89  
       2020-09-15 17:30:29 +08:00
    @youla #16 不规避.. 老哥这种陈年烂项目 不用这么上心
    THESDZ
        18
    THESDZ  
       2020-09-15 17:43:15 +08:00
    那就把这个内部改为线程池,限制他的内存,改造会导致什么问题,得看具体代码和业务
    youla
        19
    youla  
    OP
       2020-09-15 18:03:54 +08:00
    @lewis89 产生了相应的需求,不得不做
    araaaa
        20
    araaaa  
       2020-09-15 18:38:36 +08:00 via iPhone
    定时重启
    ic2y
        21
    ic2y  
       2020-09-15 18:46:07 +08:00
    @youla 在启动脚本里,加上 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/heap/java.dump 然后运行一把程序,让他内存溢出崩溃。 然后用 MAT 软件分析 /path/heap/java.dump 文件,看看是谁导致了溢出,修正之,再往复循环测试。 直到不崩溃。
    neoblackcap
        22
    neoblackcap  
       2020-09-15 21:08:25 +08:00
    @youla 你说不用规避的手段,那就是你去修掉内存泄漏的 bug 。否则所有方法都是规避手段。
    whp1473
        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 做复杂均衡,将请求均匀分布在更多的机器上
    youla
        24
    youla  
    OP
       2020-09-17 09:38:21 +08:00
    @whp1473 你好,我也不太熟悉 Java,这个类里面可能封装了 io 包里面的一些类没有及时 close,想请教下这种情况会回收吗?
    whp1473
        25
    whp1473  
       2020-09-17 10:42:13 +08:00
    @youla JVM 会自动关闭并回收,但是一般都应手动关闭,否则会一直占用无用资源。更多的情况应该是阻塞导致的。还有如果有 static 要注意,比如这种 private List<对象> list = new ArrayList<>(); list 中放入 IO,那永远不会被释放。
    youla
        26
    youla  
    OP
       2020-09-17 15:55:28 +08:00
    @whp1473 好的,多谢指教。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1319 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:14 PVG 01:14 LAX 10:14 JFK 13:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86