本帖最后由 zoutuo 于 2012-02-06 10:57:16 编辑

解决方案 »

  1.   

    你这个XX:PermSize配置的也不小啊。你还是用top看看空闲内存究竟还剩多少吧。
      

  2.   

    还有不少呢````:top - 11:11:29 up 2 days, 14:23,  2 users,  load average: 0.00, 0.01, 0.00
    Tasks:  23 total,   1 running,  22 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   1048576k total,   382920k used,   665656k free,        0k buffers
    Swap:        0k total,        0k used,        0k free,    60232k cached
      

  3.   

    -Xms256M -XX:PermSize=256M,这两个加起来就是 512MB 了。你尝试下缩小XX:PermSize参数吧,比如修改为:
     -XX:PermSize=128M -XX:MaxPermSize=128M
      

  4.   


    这样可以,而且也运行了那个jar,但一开始我就是这样设置,内存慢慢都被吃没了,当到420MB的时候,我ssh都连不上了,只能重启,才好是不是有内存泄露,。,我那个jar写的是sslsocket。但我和io有关的地方最后都close了啊。tomcat里能出现内存泄露吗?是不是和mysql不支持事务有关呢。
      

  5.   

    不是内存泄露的问题。当然我不是说你一定没有内存泄露,只是因为JVM如果内存泄露,基本都是以OOM收场的,不会泄漏到操作系统级别。你的操作系统本身就需要内存,Tomcat启动就干掉了256+256=512,实际上你的可用内存就没多少了;只不过内存也是慢慢要上来的,不是一启动就把512M全部拿走,所以你的感觉是内存慢慢被吃没。我建议你配置Tomcat不要太狠了,最好进一步尝试缩小内存,比如: -Xms128M -Xmx128M -XX:PermSize=64M -XX:MaxPermSize=64M。如果你的JAR包不是非常非常大的话XX:PermSize甚至32M都可以了。
      

  6.   

    /*非常感谢ldh911!*/你是说在执行jar包的时候也加上-XX:PermSize=32M -XX:MaxPermSize=32M 这两个参数?
    还有,什么叫“jvm如果内存泄漏,基本都是以00M收场”?
    下面是top出来的所有进程,可以看到只有tomcat、jar、mysql的内存占用是最高的。一直如此,tomcat最高的时候达到了27%,mysql和jar还没有观察过。
    当tomcat占到27%时,tomcat是这样设置的:JAVA_OPTS="-server -Xms128M -Xmx128M -Xss128k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M"  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
        1 root      20   0 10368  396  364 S  0.0  0.0   0:00.44 init
        2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd/111
        3 root      20   0     0    0    0 S  0.0  0.0   0:00.00 khelper/111
      107 root      16  -4 12636  304  260 S  0.0  0.0   0:00.00 udevd
      469 root      20   0  5928  476  364 S  0.0  0.0   0:00.20 syslogd
      485 root      20   0 62656  920  436 S  0.0  0.1   0:00.00 sshd
      493 root      20   0 21660  556  360 S  0.0  0.1   0:00.00 xinetd
      505 root      20   0 11944  660  404 S  0.0  0.1   0:00.00 mysqld_safe
      614 mysql     20   0  417m  69m 2716 S  0.0  6.8   0:55.84 mysqld
      633 root      20   0 20884  936  368 S  0.0  0.1   0:00.25 crond
      718 root      20   0 16528  608  172 S  0.0  0.1   0:00.00 nginx
      720 zoutuo    20   0 17076 1728  640 S  0.0  0.2   0:06.52 nginx
      721 zoutuo    20   0 17244 1748  640 S  0.0  0.2   0:06.44 nginx
     4045 zoutuo    20   0  205m  39m 9312 S  0.0  3.9   0:04.12 java
     4068 zoutuo    20   0  517m 218m   9m S  0.0 21.3   0:17.71 java
     4203 root      20   0 85948 3336 2616 S  0.0  0.3   0:00.01 sshd
     4205 zoutuo    20   0 85948 1716  984 S  0.0  0.2   0:00.00 sshd
     4206 zoutuo    20   0 12080 1724 1308 S  0.0  0.2   0:00.00 bash
     4228 zoutuo    20   0 12628 1192  940 R  0.0  0.1   0:00.00 top
      

  7.   

    我对CSDN的空格处理表示很无奈-_-! 凑合看吧,红色部分表示内存的占用
      

  8.   

    ◎ 你是说在执行jar包的时候也加上-XX:PermSize=32M -XX:MaxPermSize=32M 这两个参数?
    ——没,我是说,你可以考虑吧Tomcat的这个参数调整小点;其实一般不设置这个参数,除非你的项目引用了太多太多的JAR包,或者用了大量的static量,从而导致非堆内存区不足彩需要加这个参数来调大。◎ 还有,什么叫“jvm如果内存泄漏,基本都是以00M收场”?
    ——OOM就是Out Of Memory 的异常,简称OOM。是Java获取不到足够内存时所抛出的异常,你可以这么干来得到这个异常,在Eclipse里面写个代码,死循环不断分配一个100KB的字节数组,然后把这个字节数组add到ArrayList里面去,这样JVM就会没法GC到任何内存,最后OOM嗝屁。◎ 当tomcat占到27%时,tomcat是这样设置的:JAVA_OPTS="-server -Xms128M -Xmx128M -Xss128k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M"
    —— 这个配置,极限就是 128+128 = 256MB,另外再加上JVM自己占用的一些空间,总计估摸着不到300MB。而你的机器是1024MB,所以占 27% 左右也算正常。
      

  9.   

    谢谢ldh911的回答!
    我给你说一下我服务器的环境,请你帮我参谋一下参数什么的。1、mysql 这个不用说了,不过没做什么优化。。一直在跑默认
    2、tomcat。里面跑的是一个小网站,很小但开了一个端口的SSL Socket服务端。我觉得应该没问题,在finally里是写了close的
    3、一个jar文件,目的是接收文件。这个jar只做IO处理,和数据库啥的无关。
    4、tomcat和jar的socket服务器端代码我晚上可以贴出来。服务器配置:
    [zoutuo@zousServer ~]$ cat /proc/cpuinfo
    processor       : 0
    vendor_id       : GenuineIntel
    cpu family      : 6
    model           : 15
    model name      : Intel(R) Xeon(R) CPU            5160  @ 3.00GHz
    stepping        : 6
    cpu MHz         : 2992.452
    cache size      : 4096 KB
    physical id     : 0
    siblings        : 2
    core id         : 0
    cpu cores       : 2
    apicid          : 0
    initial apicid  : 0
    fpu             : yes
    fpu_exception   : yes
    cpuid level     : 10
    wp              : yes
    flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat                                                                                                  pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm constant_tsc                                                                                                  arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2                                                                                                  ssse3 cx16 xtpr pdcm dca lahf_lm tpr_shadow
    bogomips        : 5984.90
    clflush size    : 64
    cache_alignment : 64
    address sizes   : 36 bits physical, 48 bits virtual
    power management:[zoutuo@zousServer ~]$ free
                 total       used       free     shared    buffers     cached
    Mem:       1048576     397452     651124          0          0      40556
    -/+ buffers/cache:     356896     691680
    Swap:            0          0          0
      

  10.   

    贴代码啥的就免了,操作系统参数啥的并不是我强项,可能帮不到你。不过看你这个说法的话,我认为Tomcat不会对内存要求很高,可以降低启动内存。SSL协议处理Tomcat的效率可没有Apache高,如果流量大的话,可以考虑装个反向代理转么负责解决SSL,另外还可以附带处理掉所有静态资源请求,如HTML、jpg、css啥的,如果带宽不够还可以启动deflate压缩。Anyway,超出命题很多了,且不是一两句可以说完,建议逐步优化,一口也吃不成胖子,呵呵。
      

  11.   

    看来我还得深入了解下linux啊。out of memory、cannot allocate memory这些东西都出来了。不过还是谢谢你了!!结贴吧。别人也没人回复