代码
================
import java.util.*;public class Test extends Thread
{
    public static void bb()throws Exception
    {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 10240; i++)
        {
            sb.append("test");
        }
        System.out.println("PUB");
        Hashtable ht = new Hashtable();
        for (int i = 0; i < 2000; i++)
        {
            ht.put(new Integer(i), i + sb.toString());
        }
        Thread.sleep(10000L);
        System.out.println("REM");
        for (int i = 0; i < 2000; i++)
        {
            ht.remove(new Integer(i));
        }
        System.out.println("SIZE:" + ht.size());
        System.gc();
    }    public static void main(String[] args) throws Exception
    {
        System.out.println("start");
        bb();
        System.out.println("end");
        Thread.sleep(10000L);
    }
}
javac Test.java
java -Xmx512m Test
问题
==================
ht.remove(new Integer(i));// 删除之后,为什么java.exe占用的内存还是没有变化???System.out.println("end"); //就连打印出end之后java.exe占用的内存还是167,644k 为什么呀????

解决方案 »

  1.   

    用程序去调System.gc()要注意gc不是同步进行的,是异步的,也就是不一定运行之后直接被收集。
      

  2.   

    楼上正确。垃圾回收是JVM的单独线程管理的。原则上你无法强制他在某个时候必须运行。不过目前的几个JVM管理工具,好像都能强制让JVM垃圾回收的。JVm也提供了管理借口。最典型的就是 eclipse的左下角的垃圾回收按钮啦!
      

  3.   

    写System.gc();我只是在测试... 我在写程序时不写这些东西..现在问题是:服务器上的tomcat占5百多M的内存. 为了加快速度,程序中大量用到了static Hashtable. 我怀疑存在内存泄露问题.
      

  4.   

    500M,我的一般都在1.2G左右,只要不出现问题,管他呢!!还有 jconsole 你可以用这个看一下jvm的使用情况,不过你的加几个参数到JVM[code=INIFile]-Dcom.sun.management.jmxremote.port=9003 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false[/code]jconsole 远程连接,localhost 9003 就可以了。千万记得防火墙里不要把这个端口报漏了。 免得被攻击。因为我给的配置是 authenticate=false 不需要认证的。
      

  5.   

    JAVA的垃圾回收机制你是不能强制调用它的.System.gc(); 的作用只是去提醒JAVA该去回收内存了.就是1楼说的不是同步的.什么时候调用得看JAVA的.防止内存溢出可以增加JVM的内存,网上很多方法.打命令就可以了.
      

  6.   

    在服务器上jconsole死活连不上...  本地没问题.....