Java快把内存消耗光了, Top命令靠谱吗? 本帖最后由 leinchu 于 2013-02-16 11:23:47 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不明白你想说啥。如果是对JVM占用内存有疑问的话,“-Xms128m -Xmx256m” 这个只是限制了Java程序所消耗的内存,约等于 堆大小;而Heap是另记的,此外JVM自己本身的开销也是另记的。 top命令是查看cpu,内存,硬盘使用等相关状态信息的。 我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了? VIRT SWAP RES CODE DATA 啥意思,表示什么,有什么关系? VIRT 进程使用的虚拟内存总量,单位kb。SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATACODE 可执行代码占用的物理内存大小,单位kbDATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb res = 399m code=4, data= 6.4g RES=CODE+DATA 显然不成立 Linux下,used的含义跟Windows下的不太一样,它并不代表真正意义上已经被占用且无法释放的内容。在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。你可以执行这个命令看看: free -m总的来说,要对应Windows下的那个目前进程正在实际被使用的内存总量,大致应该是:used-(buffers+cache) 请问top命令中Data表示的是啥,是程序变量占的空间吗? 但是5.1G+6.4G已经超过系统可用内存了,而swap并没有被使用啊 PID %CPU VIRT RES SWAP CODE DATA COMMAND 11397 18.9 5329m 658m 0 4 5.1g java11461 16.5 6719m 362m 0 4 6.4g java 因为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 out2、包含其他进程的共享3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反4、关于库占用内存的情况,它只统计加载的库文件所占内存大小DATA1、数据占用的内存。如果top没有显示,按f键可以显示出来。2、真正的该程序要求的数据空间,是真正在运行中要使用的。 在linux版问了,无人回答,又搜素了一番,基本就是ldh911提供的那些虽然used几乎是和内存总量相当,但是,已经稳定运行两天了,没任何问题,放心了!data的含义,我想,所谓“真正在运行中要使用的”,似乎不那么准确,因为我的程序是在运行的,当然是在真正运行,但是如果真是需要那个量,我机器早崩了;所以,可能是程序申请的,但是不一定占用了那么多,就好像为了存一个用户名,你可能申请了100字节,但是用户往往都在10个以下,所以,结果是data(申请想要的)很大,但是res(实际使用的)很小。不知道是不是这样的,有高手知道的,告诉我们这些菜鸟一下。 因为你没加说明的话都以为你是windows的 JMF java开发音乐播放器 进度控制 快进 快退 怎么弄? 有趣的问题,求教 java书籍推荐 如何使用AWT显示一张在InputStream中的图片? 那位仁兄能给我解释一下“||”的用法? java中怎么实现对文件夹的压缩解压 Java制作动态报表 能不能用JAVA作一个像MSN那样的东西,把浏览器个性化?高手们发表一下看法!! Java中的时间问题 在applet中,怎么在面板上绘图呢?用滚动轴怎么控制? 不知道论坛里有没有搞Tulip平台开发的? 单词统计 求助
我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢
Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了?
VIRT SWAP RES CODE DATA 啥意思,表示什么,有什么关系?
RES=CODE+DATA 显然不成立
Linux下,used的含义跟Windows下的不太一样,它并不代表真正意义上已经被占用且无法释放的内容。在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。你可以执行这个命令看看:
free -m
总的来说,要对应Windows下的那个目前进程正在实际被使用的内存总量,大致应该是:used-(buffers+cache)
请问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
因为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、真正的该程序要求的数据空间,是真正在运行中要使用的。