Java快把内存消耗光了, Top命令靠谱吗?

leinchu 2013-02-16 11:21:32
top - 11:02:07 up 1 day, 17:37, 2 users, load average: 0.01, 0.36, 0.72
Tasks: 314 total, 1 running, 313 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.5%us, 2.6%sy, 0.0%ni, 93.6%id, 0.1%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8057596k total, 7925908k used, 131688k free, 224392k buffers
Swap: 10485752k total, 0k used, 10485752k free, 5435572k cached

PID VIRT SWAP RES CODE DATA %CPU %MEM TIME+ COMMAND
2212 6721m 0 399m 4 6.4g 24.2 5.1 491:09.83 java
2157 5329m 0 651m 4 5.1g 19.5 8.3 446:34.61 java
2413 4433m 0 208m 4 4.2g 7.9 2.6 160:33.10 java
1948 2430m 0 290m 8736 2.3g 0.7 3.7 28:03.47 mysqld
2111 2351m 0 141m 4 2.2g 0.3 1.8 13:09.25 java


我看网上说top命令的,
Res = code + data ,但是我这里看到的明显是不是这样的!

7925908k used 到底是被谁用了?
我杀死2157,used会减小大约2G
除了2157,其它的启动参数都是 -Xms128m -Xmx256m
2157的参数是-Xms512m -Xmx2048m ;

java -version

java version "1.7.0_09-icedtea"
OpenJDK Runtime Environment (rhel-2.3.3.el6_3.1-x86_64)
OpenJDK 64-Bit Server VM (build 23.2-b09, mixed mode)

我用了:jmap -dump:live,format=b,file=test4.bin 2157

...全文
954 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
leinchu 2013-02-19
  • 打赏
  • 举报
回复
在linux版问了,无人回答, 又搜素了一番,基本就是ldh911提供的那些 虽然used几乎是和内存总量相当,但是,已经稳定运行两天了,没任何问题,放心了! data的含义,我想,所谓“真正在运行中要使用的”,似乎不那么准确,因为我的程序是在运行的,当然是在真正运行,但是如果真是需要那个量,我机器早崩了; 所以,可能是程序申请的,但是不一定占用了那么多,就好像为了存一个用户名,你可能申请了100字节,但是用户往往都在10个以下,所以,结果是data(申请想要的)很大,但是res(实际使用的)很小。 不知道是不是这样的, 有高手知道的,告诉我们这些菜鸟一下。
djnjc 2013-02-19
  • 打赏
  • 举报
回复
因为你没加说明的话都以为你是windows的
MiceRice 2013-02-17
  • 打赏
  • 举报
回复
引用 8 楼 leinchu 的回复:
请问top命令中Data表示的是啥,是程序变量占的空间吗? 但是5.1G+6.4G已经超过系统可用内存了,而swap并没有被使用啊
因为JVM本身是虚拟机,所以几乎所有空间都是JVM先申请然后再自行进行二次分配的,都算是DATA; 如果用C来说的话,就是 malloc 跟操作系统所申请的空间。 比如申请掉1G的空间就是: char *c = malloc(1024 * 1024 * 1024)。 这里情况有点复杂,因为Linux的内存机制跟Windows确实很不一样: VIRT 是虚拟内存,相当于是 程序期望所使用的总内存,但并不是操作系统实际给到程序的内存; 比如这个程序,用C的: int main() { char *c = malloc(1024 * 1024 * 1024); sleep(10000); return 0; } 那么实际情况可能是: PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP CODE DATA COMMAND 23673 root 16 0 1026m 276 220 S 0.0 0.0 0:00.00 1.0g 0 1.0g malloc 不过老实说,为啥你这里的SWAP又是0,这个确实有点奇怪,估计要去Linux板块问问了。 VIRT:virtual memory usage 虚拟内存 1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等 2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量 RES:resident memory usage 常驻内存 1、进程当前使用的内存大小,但不包括swap out 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反 4、关于库占用内存的情况,它只统计加载的库文件所占内存大小 DATA 1、数据占用的内存。如果top没有显示,按f键可以显示出来。 2、真正的该程序要求的数据空间,是真正在运行中要使用的。
leinchu 2013-02-17
  • 打赏
  • 举报
回复
引用 7 楼 ldh911 的回复:
引用 3 楼 leinchu 的回复:我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢 Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了? Linux下,used的含义跟Windows下的不太一样,它并不代表真……
请问top命令中Data表示的是啥,是程序变量占的空间吗? 但是5.1G+6.4G已经超过系统可用内存了,而swap并没有被使用啊 PID %CPU VIRT RES SWAP CODE DATA COMMAND 11397 18.9 5329m 658m 0 4 5.1g java 11461 16.5 6719m 362m 0 4 6.4g java
  • 打赏
  • 举报
回复
top命令是查看cpu,内存,硬盘使用等相关状态信息的。
MiceRice 2013-02-16
  • 打赏
  • 举报
回复
不明白你想说啥。 如果是对JVM占用内存有疑问的话,“-Xms128m -Xmx256m” 这个只是限制了Java程序所消耗的内存,约等于 堆大小;而Heap是另记的,此外JVM自己本身的开销也是另记的。
MiceRice 2013-02-16
  • 打赏
  • 举报
回复
引用 3 楼 leinchu 的回复:
我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢 Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了?
Linux下,used的含义跟Windows下的不太一样,它并不代表真正意义上已经被占用且无法释放的内容。 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。 你可以执行这个命令看看: free -m 总的来说,要对应Windows下的那个目前进程正在实际被使用的内存总量,大致应该是:used-(buffers+cache)
leinchu 2013-02-16
  • 打赏
  • 举报
回复
引用 5 楼 fangmingshijie 的回复:
VIRT 进程使用的虚拟内存总量,单位kb。 SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA CODE 可执行代码占用的物理内存大小,单位kb DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
res = 399m code=4, data= 6.4g RES=CODE+DATA 显然不成立
  • 打赏
  • 举报
回复
VIRT 进程使用的虚拟内存总量,单位kb。 SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA CODE 可执行代码占用的物理内存大小,单位kb DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
leinchu 2013-02-16
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
top命令是查看cpu,内存,硬盘使用等相关状态信息的。
VIRT SWAP RES CODE DATA 啥意思,表示什么,有什么关系?
leinchu 2013-02-16
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
不明白你想说啥。 如果是对JVM占用内存有疑问的话,“-Xms128m -Xmx256m” 这个只是限制了Java程序所消耗的内存,约等于 堆大小;而Heap是另记的,此外JVM自己本身的开销也是另记的。
我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢 Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧