java内存回收问题...

iwlk 2008-01-03 11:03:53
代码
================
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 为什么呀????
...全文
411 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iwlk 2008-01-05
  • 打赏
  • 举报
回复
在服务器上jconsole死活连不上... 本地没问题.....
老紫竹 2008-01-03
  • 打赏
  • 举报
回复
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 不需要认证的。

iwlk 2008-01-03
  • 打赏
  • 举报
回复
写System.gc();我只是在测试...

我在写程序时不写这些东西..

现在问题是:服务器上的tomcat占5百多M的内存. 为了加快速度,程序中大量用到了static Hashtable. 我怀疑存在内存泄露问题.
  • 打赏
  • 举报
回复
一般来说不建议在代码中显式地调用垃圾处理,这样根本就达不到回收的要求,
而这样只会降低执行的效率。
iwlk 2008-01-03
  • 打赏
  • 举报
回复
这样的话,那查内存泄露,其不比登天还难....
iwlk 2008-01-03
  • 打赏
  • 举报
回复
-_-!!!
老紫竹 2008-01-03
  • 打赏
  • 举报
回复
楼上正确。

垃圾回收是JVM的单独线程管理的。原则上你无法强制他在某个时候必须运行。

不过目前的几个JVM管理工具,好像都能强制让JVM垃圾回收的。JVm也提供了管理借口。

最典型的就是 eclipse的左下角的垃圾回收按钮啦!

runbeck 2008-01-03
  • 打赏
  • 举报
回复
用程序去调System.gc()要注意gc不是同步进行的,是异步的,也就是不一定运行之后直接被收集。
psyl 2008-01-03
  • 打赏
  • 举报
回复
学习,希望自己赶紧能学习到楼上几位兄弟的程度。
lihaifeng0412 2008-01-03
  • 打赏
  • 举报
回复
自动控制的
fengran22 2008-01-03
  • 打赏
  • 举报
回复
JAVA的垃圾回收机制你是不能强制调用它的.System.gc(); 的作用只是去提醒JAVA该去回收内存了.就是1楼说的不是同步的.什么时候调用得看JAVA的.防止内存溢出可以增加JVM的内存,网上很多方法.打命令就可以了.
abner1314 2008-01-03
  • 打赏
  • 举报
回复
学习~

62,623

社区成员

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

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