我一般采用Swing/Servlet/DataBase做应用系统,系统基于Web,运行在IEExplorer中。
因为主要表现形式是Applet,而且基于多个Applet间切换。由于Java运行速度原因,Applet装载得特别慢,所以我实现时是只生成一个空的Applet,当用户点击需要浏览其他Applet时,系统将对应Applet中的内容生成后装载进来,这样只是第一次装在Applet时较费时,后面的操作过程与响应速度和C/S结构差不多。由于是业务应用运算系统,自然与数据库的交互比较多,因此数据设计采用的是客户端缓存的方式,即建立一个数据管理的类,将其中所有的数据定义成static,然后在各Applet间调用。操作速度确实很快,但是我发现一个问题,在任务管理其中查看浏览网页所占的内存,用户操作的越久,所占内存越多,根本没有释放的迹象,有时用Java自带的资源管理函数查看,还有好多内存时,网页竟然报outMemory错。
到底是我弄错了,还是其他什么原因?
参与者有分。
因为主要表现形式是Applet,而且基于多个Applet间切换。由于Java运行速度原因,Applet装载得特别慢,所以我实现时是只生成一个空的Applet,当用户点击需要浏览其他Applet时,系统将对应Applet中的内容生成后装载进来,这样只是第一次装在Applet时较费时,后面的操作过程与响应速度和C/S结构差不多。由于是业务应用运算系统,自然与数据库的交互比较多,因此数据设计采用的是客户端缓存的方式,即建立一个数据管理的类,将其中所有的数据定义成static,然后在各Applet间调用。操作速度确实很快,但是我发现一个问题,在任务管理其中查看浏览网页所占的内存,用户操作的越久,所占内存越多,根本没有释放的迹象,有时用Java自带的资源管理函数查看,还有好多内存时,网页竟然报outMemory错。
到底是我弄错了,还是其他什么原因?
参与者有分。
2.OUTOFMEMORY,在运行参数中设置下,将默认的64M内存放大到128M.这只是延长使用时间,根本是优化程序
3.可以关闭SWING的双缓冲,默认开启
按照我的理解应该是怎么回事呢,所有全局变量数据(不包括Swing组件)是static的,系统一旦运行,所占的内存应该是确定的。然后不管系统怎么运行,没有生成新的全局变量,所以内存开销不会扩大。但事实上不是那样的,当该系统重复点击每多运行一遍,所占内存要扩大4MB。不知道是Swing没释放,还是static重新赋值后,原来的值没被回收。
实在不知道怎么回事。
你也可以显示的调用System.gc();
===========================
这种模式我又考虑呀,这样的话可以将所有操作放在Frame中,呵呵,如果不要applet,那就纯粹的c/s了,可是我们老大不肯。
事实上真的采用那种模式也未必就更好。
将lst.size()提到for循环的外面就会大大的提高效率,用完的对象注意设为null等等,像这样的代码优化都注意一下,程序的效率会得到很大提高
其次,如果将对象声明为了static,其声明周期就是整个程序的存活期,这类对象自然无法回收;
还有,关于outMemory问题,java中内存的限制是通过java -Xmx 来限制的;
感觉那样可能好一点
将lst.size()提到for循环的外面就会大大的提高效率
我感觉自己的程序运行效率没有任何问题,只是所占内存越来越大,有点像JBuilder,资源没得到释放。
不要指望。JVM会帮你作全部的事情哦。
自己作一下。你就会知道效果的。