看周边搞的 java 伙伴,普遍反映 java 项目太吃内存,动不动要重启服务,不知道对于吃内存以及内存泄露大家有没有处理方式
1
qping 2021-02-21 09:08:59 +08:00
内存不够加内存,实在不行优化代码
内存泄漏的话 用 MAT ( MemoryAnalyzerTool ) 分析下,看下哪里出问题了 |
2
pjntt 2021-02-21 09:13:07 +08:00
应用吃内存跟 OOM 不是一个事情
|
4
tachikomachann 2021-02-21 09:52:19 +08:00 via Android
建议先用 JVM 监控工具分析下占用内存多的都是些什么对象,如果发现是业务相关的,就很好优化了,改改代码,复用对象或者让对象早点被 young gc 就能省大把内存。
|
5
guyeu 2021-02-21 10:05:22 +08:00
很多常用的框架没有太考虑内存使用,但这个和动不动就要重启是两回事。你这个明显是实现的问题,就不要怪语言了。
|
6
kaokao123 2021-02-21 10:16:34 +08:00 via Android
这跟内存泄露一点关系都没有。Java 吃内存是因为它使用虚拟机进行内存的管理和回收。不像 c++和 objective-c 使用完就主动释放,java 是虚拟机会定期进行内存的回收,在内存没有回收之前就会一直占用。这就是为什么 ios 需要的内存比安卓少的原因。
|
7
chendy 2021-02-21 11:32:39 +08:00 1
1. 普遍反映 java 项目太吃内存
不设置参数默认最大堆是 1/4 系统内存,加上除了堆的部分吃掉 1/3 不是问题 不过确实吃得多,手里的项目启动起来元数据区就直奔 100m,对于配置低内存小的机器并不友好 2. 动不动要重启服务 为啥要重启服务呢? 3. 不知道对于吃内存以及内存泄露大家有没有处理方式 吃内存:就让它吃,设置参数限制它吃 内存泄漏:加参数打 dump,或者直接 jmap 拿 dump,然后分析 dump 定位泄露点修好就行了 |
8
limuyan44 2021-02-21 13:07:29 +08:00
对 java 有误解,干这么多年没见过要动不动重启服务的应用更别说因为内存不够去重启服务的。
|
9
Jooooooooo 2021-02-21 14:09:15 +08:00
谁家动不动重启服务解决内存问题?
基础知识不过关啊. |
10
newmlp 2021-02-21 14:47:33 +08:00
只要还能用,你管他内存占用多少
|
11
zhazi 2021-02-21 15:23:05 +08:00 via Android
内存泄露是指,某个对象没用使用,没有释放内存,且随着系统运行时间增长,该对象消耗内存持续增长,最终引起系统崩溃。
如果某个对象没有使用,但是该对象使用的内存恒定。那么这个对象只是个普通的对象。 btw 我这面给你解决内存泄露的话先远离你周边的小伙伴,结交一些懂技术的就可以了 |
12
kingfalse 2021-02-21 16:18:59 +08:00 via Android
我司某个 Java 项目启动参数就 100G 内存。。。。。
|
13
xarthur 2021-02-21 16:44:12 +08:00
内存泄漏难道不是 bug 吗……是 Bug 就修啊……
|
14
coolesting 2021-02-21 17:22:22 +08:00
我的 android studio 用着用着,电脑的风扇实然 疯,狂,咆,哮, 打开个任务管理一看 java.exe 吃了一 G 内存, 大哥,我就用个编辑器而已,吸性能用不用吸得这么猛
|
15
zhuangzhuang1988 2021-02-21 17:30:48 +08:00 via Android
有病就治,跳大神没用的
|
17
ic2y 2021-02-21 19:36:37 +08:00
@fxjson 让程序跑很长一段时间,内存占用大了之后,jmap dump 出来 jvm 的内存使用,eclipse 有个 MAT 工具,会简单地自动分析下内存泄漏的原因。
然后,在 MAT 里找到内存消耗比较大的而且是可达( Reachable,不可达的有 unReachable 标记)的类,在 MAT 里的对象上,鼠标右键 GC Path,看看引用路径。就大概知道了。 |
18
msg7086 2021-02-21 20:19:19 +08:00 via Android
内存泄漏可以分析。
内存不够可以加内存。 啊?嫌内存用得多?旁边有用内存少的语言和运行环境,欢迎重写。 |
19
cheng6563 2021-02-21 22:22:37 +08:00 via Android
Java 一方面的确内存占用较大,尤其是用了一堆重形框架后。
另一方面 jvm 有个问题是很不喜欢把用过的内存还给操作系统。 |
20
cheng6563 2021-02-21 22:24:18 +08:00 via Android
openj9 的 jvm 内存占用会小很多,但是目前版本号依然没到 1.0.0 。非生产环境可以用用
|
21
Lemeng 2021-02-21 22:59:41 +08:00
泄露,靠自己就行。吃不够,就加点
|
22
geekvcn 2021-02-21 23:00:31 +08:00
内存泄漏你用 C++不是更爆炸
|
23
kingfalse 2021-02-21 23:22:56 +08:00 via Android
回到正题,最起码的启动就加上-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/kar 这俩参数参数,起码蹦的时候还能挖挖坟看看到底是谁的墓( bug )
|
24
securityCoding 2021-02-22 09:43:06 +08:00
dump 下来用 mat 看下就知道哪里泄露了,线程就用 jstack 看
|
25
lonelymarried 2021-02-22 10:36:11 +08:00
哦豁,我新入坑 java,一个项目就是用 java 写的,现在上线了,还没用户的,关键是我 java 新手,还不知道咋解决这个问题。go 是不是要好些,不用担心这些,直接写业务就行了?早知道该选 go 写的。
|