Java的垃圾根本没回收[100分]

shengli_liao 2007-03-13 09:28:36
我一般采用Swing/Servlet/DataBase做应用系统,系统基于Web,运行在IEExplorer中。
因为主要表现形式是Applet,而且基于多个Applet间切换。由于Java运行速度原因,Applet装载得特别慢,所以我实现时是只生成一个空的Applet,当用户点击需要浏览其他Applet时,系统将对应Applet中的内容生成后装载进来,这样只是第一次装在Applet时较费时,后面的操作过程与响应速度和C/S结构差不多。由于是业务应用运算系统,自然与数据库的交互比较多,因此数据设计采用的是客户端缓存的方式,即建立一个数据管理的类,将其中所有的数据定义成static,然后在各Applet间调用。操作速度确实很快,但是我发现一个问题,在任务管理其中查看浏览网页所占的内存,用户操作的越久,所占内存越多,根本没有释放的迹象,有时用Java自带的资源管理函数查看,还有好多内存时,网页竟然报outMemory错。
到底是我弄错了,还是其他什么原因?
参与者有分。
...全文
636 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzjackie 2007-03-28
  • 打赏
  • 举报
回复
有是时候,也有要自己来清理内存哦。
不要指望。JVM会帮你作全部的事情哦。
自己作一下。你就会知道效果的。
shengli_liao 2007-03-19
  • 打赏
  • 举报
回复
只是我一个人用的变量,没什么必要放到singleton类呀。
将lst.size()提到for循环的外面就会大大的提高效率。。。
我感觉自己的程序运行效率没有任何问题,只是所占内存越来越大,有点像JBuilder,资源没得到释放。
littlegang 2007-03-18
  • 打赏
  • 举报
回复
有考虑过将持久数据放入singleton类的对象中吗?
感觉那样可能好一点
shengli_liao 2007-03-16
  • 打赏
  • 举报
回复
资源根本没死?不明白为什么说没死,我唯一更改的是static修饰的变量,没有其他的全局变量呀。
shengli_liao 2007-03-16
  • 打赏
  • 举报
回复
让applet new出frame不就得了
===========================
这种模式我又考虑呀,这样的话可以将所有操作放在Frame中,呵呵,如果不要applet,那就纯粹的c/s了,可是我们老大不肯。
事实上真的采用那种模式也未必就更好。
guojing590 2007-03-16
  • 打赏
  • 举报
回复
首先,java的垃圾回收的时间是不确定的;有的jvm根据运行时间进行回收,有的根据空间站用情况进行回收,在程序中,显示调用System.gc();只是通知jvm一声:需要进行垃圾回收;并不是要jvm马上执行。
其次,如果将对象声明为了static,其声明周期就是整个程序的存活期,这类对象自然无法回收;
还有,关于outMemory问题,java中内存的限制是通过java -Xmx 来限制的;
beibeiG 2007-03-16
  • 打赏
  • 举报
回复
Applet 没有实际用过,只知道皮毛,不懂,学习中。。。。
beibeiG 2007-03-16
  • 打赏
  • 举报
回复
效率上主要还是要注意程序结构和代码的优化,比如像 for(int i = 0; i < lst.size(); i++)
将lst.size()提到for循环的外面就会大大的提高效率,用完的对象注意设为null等等,像这样的代码优化都注意一下,程序的效率会得到很大提高
shaot399 2007-03-16
  • 打赏
  • 举报
回复
可以通过JNI的方式去实现
shengli_liao 2007-03-15
  • 打赏
  • 举报
回复
显式调用System.gc()好像根本没什么效果,我在写程序时,一般大型计算前都调用一把,没什么显著效果。
hanjin26 2007-03-15
  • 打赏
  • 举报
回复
不知楼主搞什么鬼,用一个网页嵌一个applet,然后让applet new出frame不就得了.打包的jar可以下载到本机的(除非有新版本),这都可以在html也没里头指定.这样做只有第一次运行比较慢(因为要下载jar),以后运行都是飞快的,一定一定采用另外一个线程并包装成事件模式处理server/client的通讯,这样写的swing/servlet程序简单明了,而且自然.速度嘛,除非你一秒钟能敲1000个字符?否则那里来的速度慢?
lixiaoxue85 2007-03-15
  • 打赏
  • 举报
回复
因为你使用的资源根本没死,不要指望JAVA回收机制了.关键是程序的优化,哪些资源不需要全局的却全局了,你再调用GC也没用
「已注销」 2007-03-13
  • 打赏
  • 举报
回复
可能是和ie中调用jvm实现有关,如果每个Applet分别启动一个jvm的话,就不好说了
shengli_liao 2007-03-13
  • 打赏
  • 举报
回复
Swing程序在IE中运行,IE的所占内存都越来越大,但是增长速度没有这里的这么惊人。我测试过自己的系统,即使在客户端控制台采用cx,内存一样得不到回收。我采用的512MB内存的机器,当程序从前到后连续运行约10遍后,内存溢出。虽然不影响客户使用,但总感觉是隐患。
shengli_liao 2007-03-13
  • 打赏
  • 举报
回复
系统中的STATIC全局变量当然不能回收,这些数据要在整个客户端共享。
按照我的理解应该是怎么回事呢,所有全局变量数据(不包括Swing组件)是static的,系统一旦运行,所占的内存应该是确定的。然后不管系统怎么运行,没有生成新的全局变量,所以内存开销不会扩大。但事实上不是那样的,当该系统重复点击每多运行一遍,所占内存要扩大4MB。不知道是Swing没释放,还是static重新赋值后,原来的值没被回收。
实在不知道怎么回事。
lixiaoxue85 2007-03-13
  • 打赏
  • 举报
回复
1.JAVA垃圾回收器并不是回收所有东西的,你定义成STATIC全局变量,只有程序死了其生命周期才结束.JVM当然不会去回收他
2.OUTOFMEMORY,在运行参数中设置下,将默认的64M内存放大到128M.这只是延长使用时间,根本是优化程序
3.可以关闭SWING的双缓冲,默认开启
aoyihuashao 2007-03-13
  • 打赏
  • 举报
回复
把STATIC回收了,就没的跑了。。
frilly 2007-03-13
  • 打赏
  • 举报
回复
Java的垃级回收机制是作为服务线程运行的,也许清除的并不是很及时,
你也可以显示的调用System.gc();
frilly 2007-03-13
  • 打赏
  • 举报
回复
路过,关注中!

62,614

社区成员

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

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