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

2021-02-21 09:00:12 +08:00
 fxjson

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

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

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

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

然后,在 MAT 里找到内存消耗比较大的而且是可达( Reachable,不可达的有 unReachable 标记)的类,在 MAT 里的对象上,鼠标右键 GC Path,看看引用路径。就大概知道了。
msg7086
2021-02-21 20:19:19 +08:00
内存泄漏可以分析。
内存不够可以加内存。
啊?嫌内存用得多?旁边有用内存少的语言和运行环境,欢迎重写。
cheng6563
2021-02-21 22:22:37 +08:00
Java 一方面的确内存占用较大,尤其是用了一堆重形框架后。
另一方面 jvm 有个问题是很不喜欢把用过的内存还给操作系统。
cheng6563
2021-02-21 22:24:18 +08:00
openj9 的 jvm 内存占用会小很多,但是目前版本号依然没到 1.0.0 。非生产环境可以用用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/754770

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX