jvm 疑惑

写了个ANT实现把本地代码打成*war然后替换服务器上正在运行的项目.小弟思路是先undeploy服务器上项目,然后再deploy新的,终于达到目的. 但是如果在本地执行一次ANT,成功后又继续执行一才ANT,这样5次左右,服务器的TOMCAT会报:java.lang.OutOfMemoryError: PermGen 错误,上网查询知道解决问题方法是:JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m “Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误”
但是有个问题就疑问了:即使我增大了PermSize,也许我连续5次不会报错了,但是我也许10次或者更多次,会不会报错?
像我这种情况,在每次ANT后,服务器的PermGen space加载class,在不重启动tomcat情况下,我下次使用ANT的时候,PermGen space会不会实现累计加载,就像本来100个地方,第一次用了20个地方,第2次用了20个地方,所以说第5次就出错.
望大虾帮我解惑!如果有方法在ANT下解决这个问题,请指导

[b]问题补充:[/b]
lewhwa:
我可不可以这样理解你的话:就是说如果TOMCAT不关闭,我每ANT一次,classloader会增加PermGen space里的class数量,所以说,如果我在我不停止tomcat的情况下,继续ANT的话,就会出现:java.lang.OutOfMemoryError: PermGen ?请指导,我就想知道到底是怎么回事
[b]问题补充:[/b]
lewhwa:
我用的是tomcat5.5...
http://wiki.apache.org/tomcat/FAQ/Deployment 刚刚看到这个 觉得好象有点懂了,但是同样又出问题了,是不是除了重启tomcat才能根本解决这个问题?因为我根本不知道我在第几次ANT的时候 会出现问题... 还有你刚说的"Ant进行部署和构建采用的JVM,Tomcat有自己的JVM" 这个麻烦给个连接让我了解哈...
[b]问题补充:[/b]
bohemia:
我刚刚还在查ant的undeploy能不能释放"PermGen space"里的class?但是一直没找到.. 请指导哈
[b]问题补充:[/b]
lewhwa:
你的意思是不是说:ant的undeploy能释放"PermGen space"里的class,这样再次deploy时候不会让"PermGen space" 累加?如果出错的话,肯定是因为应用本身的问题?
[b]问题补充:[/b]
lewhwa:
我现在又重新测试了哈,在第4次ANT后,服务器的tomcat,又出现这种问题:java.lang.OutOfMemoryError: PermGen ,
我在Tomcat Wiki 下找到这样的话:
Why does the memory usage increase when I redeploy a web application?

Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
-----按我的理解它的意思跟你的看法有些不一样..不知道是我理解错误,还是....请指导
[b]问题补充:[/b]
lewhwa:
也就是说 我现在应该从应用上找问题? 如果是这样,请指导哈方法..

[quote]也就是说 我现在应该从应用上找问题? 如果是这样,请指导哈方法..[/quote]
要得,不过你先用一个empty Web Application多做一下Deploy和unploy试验试试看。
另外可以用JConsole(JDK自带),和JProfile来监视。

是今天http://www.iteye.com/problems/10130问题的继续吧?
就这样说吧,Ant只管Tomcat的任务操作,与Tomcat的内存和其它方面的调整没有关系。PermGen space等等与Ant一点关系都没有。

PS:
Ant进行部署和构建采用的JVM,Tomcat有自己的JVM。两者是井水不犯河水。

[quote]我可不可以这样理解你的话:就是说如果TOMCAT不关闭,我每ANT一次,classloader会增加PermGen space里的class数量,所以说,如果我在我不停止tomcat的情况下,继续ANT的话,就会出现:java.lang.OutOfMemoryError: PermGen ?请指导,我就想知道到底是怎么回事[/quote]
不知道你用的Tomcat是啥版本,现在主流的Application Server都支持热部署的。我用过GlassFish和tomcat 6.X都没有出现你说过的现象。

不会是你内存泄漏了吧?
呵呵. 应用服务器,部署,取消;如果都能让服务器OOM,说明.在deploy或者undeploy的时候,有资源未释放.

建议你换个空的工程;试试看; 如果其他工程没问题,只有你目前使用的工程有问题;

就可以确定是工程问题,而不是Tomcat的问题.

呵呵.是我误解了..
lewhwa 给的TOmcat的deployment,已经说了.
这个是TOmcat自身配置的原因;

我Tomcat用的不多.整天WLS的.呵呵; 看来Tomcat这点不好用;

应该是你的应用除了问题,阻止了Tomcat的unploy不能释放资源。

PS:你用一个empty Web Application多做一下Deploy和unploy试验试试看。

你的意思是不是说:ant的undeploy能释放"PermGen space"里的class,这样再次deploy时候不会让"PermGen space" 累加?如果出错的话,肯定是因为应用本身的问题?
是的!

[quote]Why does the memory usage increase when I redeploy a web application?

Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually. [/quote]
它的意思的确是redeploy会增加Memory。但是,并没有说unploy不会减少Memory。我没有整个的Context,其它的不好说。