本帖最后由 leinchu 于 2013-02-16 11:23:47 编辑

解决方案 »

  1.   

    不明白你想说啥。如果是对JVM占用内存有疑问的话,“-Xms128m -Xmx256m” 这个只是限制了Java程序所消耗的内存,约等于 堆大小;而Heap是另记的,此外JVM自己本身的开销也是另记的。
      

  2.   

    top命令是查看cpu,内存,硬盘使用等相关状态信息的。
      

  3.   


    我的意思是,top看到只消耗了631兆内存,但是,系统的可用内存怎么就没了呢
    Heap jvm这些,消耗的内存也应该能用top看到吧,我的top是按照res排序的,就那几个java占res(内存?)多,但是他们加起来也远远不到7G内存啊,那些内存谁占用了?
      

  4.   


    VIRT SWAP  RES CODE DATA 啥意思,表示什么,有什么关系?
      

  5.   

    VIRT 进程使用的虚拟内存总量,单位kb。SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATACODE 可执行代码占用的物理内存大小,单位kbDATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
      

  6.   

    res = 399m    code=4, data= 6.4g 
    RES=CODE+DATA 显然不成立
      

  7.   


    Linux下,used的含义跟Windows下的不太一样,它并不代表真正意义上已经被占用且无法释放的内容。在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。你可以执行这个命令看看:
        free -m
    总的来说,要对应Windows下的那个目前进程正在实际被使用的内存总量,大致应该是:used-(buffers+cache)
      

  8.   


    请问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   
      

  9.   


    因为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、真正的该程序要求的数据空间,是真正在运行中要使用的。
      

  10.   

    在linux版问了,无人回答,又搜素了一番,基本就是ldh911提供的那些虽然used几乎是和内存总量相当,但是,已经稳定运行两天了,没任何问题,放心了!data的含义,我想,所谓“真正在运行中要使用的”,似乎不那么准确,因为我的程序是在运行的,当然是在真正运行,但是如果真是需要那个量,我机器早崩了;所以,可能是程序申请的,但是不一定占用了那么多,就好像为了存一个用户名,你可能申请了100字节,但是用户往往都在10个以下,所以,结果是data(申请想要的)很大,但是res(实际使用的)很小。不知道是不是这样的,有高手知道的,告诉我们这些菜鸟一下。
      

  11.   

    因为你没加说明的话都以为你是windows的