V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
fxjson
V2EX  ›  程序员

Java 如何解决内存泄露问题,有哪些手段

  •  
  •   fxjson · 2021-02-21 09:00:12 +08:00 · 4239 次点击
    这是一个创建于 1407 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看周边搞的 java 伙伴,普遍反映 java 项目太吃内存,动不动要重启服务,不知道对于吃内存以及内存泄露大家有没有处理方式

    25 条回复    2021-02-22 10:36:11 +08:00
    qping
        1
    qping  
       2021-02-21 09:08:59 +08:00
    内存不够加内存,实在不行优化代码
    内存泄漏的话 用 MAT ( MemoryAnalyzerTool ) 分析下,看下哪里出问题了
    pjntt
        2
    pjntt  
       2021-02-21 09:13:07 +08:00
    应用吃内存跟 OOM 不是一个事情
    andj4cn
        3
    andj4cn  
       2021-02-21 09:51:00 +08:00
    @pjntt 哈哈哈,OOM 和 吃内存、内存泄漏都不是一个事情
    tachikomachann
        4
    tachikomachann  
       2021-02-21 09:52:19 +08:00 via Android
    建议先用 JVM 监控工具分析下占用内存多的都是些什么对象,如果发现是业务相关的,就很好优化了,改改代码,复用对象或者让对象早点被 young gc 就能省大把内存。
    guyeu
        5
    guyeu  
       2021-02-21 10:05:22 +08:00
    很多常用的框架没有太考虑内存使用,但这个和动不动就要重启是两回事。你这个明显是实现的问题,就不要怪语言了。
    kaokao123
        6
    kaokao123  
       2021-02-21 10:16:34 +08:00 via Android
    这跟内存泄露一点关系都没有。Java 吃内存是因为它使用虚拟机进行内存的管理和回收。不像 c++和 objective-c 使用完就主动释放,java 是虚拟机会定期进行内存的回收,在内存没有回收之前就会一直占用。这就是为什么 ios 需要的内存比安卓少的原因。
    chendy
        7
    chendy  
       2021-02-21 11:32:39 +08:00   ❤️ 1
    1. 普遍反映 java 项目太吃内存
    不设置参数默认最大堆是 1/4 系统内存,加上除了堆的部分吃掉 1/3 不是问题
    不过确实吃得多,手里的项目启动起来元数据区就直奔 100m,对于配置低内存小的机器并不友好
    2. 动不动要重启服务
    为啥要重启服务呢?
    3. 不知道对于吃内存以及内存泄露大家有没有处理方式
    吃内存:就让它吃,设置参数限制它吃
    内存泄漏:加参数打 dump,或者直接 jmap 拿 dump,然后分析 dump 定位泄露点修好就行了
    limuyan44
        8
    limuyan44  
       2021-02-21 13:07:29 +08:00
    对 java 有误解,干这么多年没见过要动不动重启服务的应用更别说因为内存不够去重启服务的。
    Jooooooooo
        9
    Jooooooooo  
       2021-02-21 14:09:15 +08:00
    谁家动不动重启服务解决内存问题?

    基础知识不过关啊.
    newmlp
        10
    newmlp  
       2021-02-21 14:47:33 +08:00
    只要还能用,你管他内存占用多少
    zhazi
        11
    zhazi  
       2021-02-21 15:23:05 +08:00 via Android
    内存泄露是指,某个对象没用使用,没有释放内存,且随着系统运行时间增长,该对象消耗内存持续增长,最终引起系统崩溃。
    如果某个对象没有使用,但是该对象使用的内存恒定。那么这个对象只是个普通的对象。

    btw 我这面给你解决内存泄露的话先远离你周边的小伙伴,结交一些懂技术的就可以了
    kingfalse
        12
    kingfalse  
       2021-02-21 16:18:59 +08:00 via Android
    我司某个 Java 项目启动参数就 100G 内存。。。。。
    xarthur
        13
    xarthur  
       2021-02-21 16:44:12 +08:00
    内存泄漏难道不是 bug 吗……是 Bug 就修啊……
    coolesting
        14
    coolesting  
       2021-02-21 17:22:22 +08:00
    我的 android studio 用着用着,电脑的风扇实然 疯,狂,咆,哮, 打开个任务管理一看 java.exe 吃了一 G 内存, 大哥,我就用个编辑器而已,吸性能用不用吸得这么猛
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       2021-02-21 17:30:48 +08:00 via Android
    有病就治,跳大神没用的
    liuxey
        16
    liuxey  
       2021-02-21 18:54:51 +08:00
    @kingfalse #12 来一次 GC 这不起飞
    ic2y
        17
    ic2y  
       2021-02-21 19:36:37 +08:00
    @fxjson 让程序跑很长一段时间,内存占用大了之后,jmap dump 出来 jvm 的内存使用,eclipse 有个 MAT 工具,会简单地自动分析下内存泄漏的原因。

    然后,在 MAT 里找到内存消耗比较大的而且是可达( Reachable,不可达的有 unReachable 标记)的类,在 MAT 里的对象上,鼠标右键 GC Path,看看引用路径。就大概知道了。
    msg7086
        18
    msg7086  
       2021-02-21 20:19:19 +08:00 via Android
    内存泄漏可以分析。
    内存不够可以加内存。
    啊?嫌内存用得多?旁边有用内存少的语言和运行环境,欢迎重写。
    cheng6563
        19
    cheng6563  
       2021-02-21 22:22:37 +08:00 via Android
    Java 一方面的确内存占用较大,尤其是用了一堆重形框架后。
    另一方面 jvm 有个问题是很不喜欢把用过的内存还给操作系统。
    cheng6563
        20
    cheng6563  
       2021-02-21 22:24:18 +08:00 via Android
    openj9 的 jvm 内存占用会小很多,但是目前版本号依然没到 1.0.0 。非生产环境可以用用
    Lemeng
        21
    Lemeng  
       2021-02-21 22:59:41 +08:00
    泄露,靠自己就行。吃不够,就加点
    geekvcn
        22
    geekvcn  
       2021-02-21 23:00:31 +08:00
    内存泄漏你用 C++不是更爆炸
    kingfalse
        23
    kingfalse  
       2021-02-21 23:22:56 +08:00 via Android
    回到正题,最起码的启动就加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/kar 这俩参数参数,起码蹦的时候还能挖挖坟看看到底是谁的墓( bug )
    securityCoding
        24
    securityCoding  
       2021-02-22 09:43:06 +08:00
    dump 下来用 mat 看下就知道哪里泄露了,线程就用 jstack 看
    lonelymarried
        25
    lonelymarried  
       2021-02-22 10:36:11 +08:00
    哦豁,我新入坑 java,一个项目就是用 java 写的,现在上线了,还没用户的,关键是我 java 新手,还不知道咋解决这个问题。go 是不是要好些,不用担心这些,直接写业务就行了?早知道该选 go 写的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.