大梦想家

5年开发工程师,2年实施经理,X年售前顾问,......
数据加载中……
再次寻求从事过Java桌面的应用的朋友解惑~
       今天早上的Blog大家都看到了,大家的留言我也一一拜读过了~感谢 zhrb ,千里冰封 javazhai ,BeanSoft ,plankton13 ,mingj 等的回复。
        下午反省了一下自己的代码,得出一下结论和疑问,有时间,请大家再讨论一下。
        1.反省代码,整理所有用过的对象,特别上查询完数据库返回的上万条记录的结果集,一一将他们制空,然后再System.gc()看看效果;
        2.因为是通用数据查询平台,那么结果集的展示形式是可以由实施人员自由定义的,比方说字体,颜色,图片等等,虽然我没有使用JFace对资源封装的统一标准组件,但是绝对是在使用完一一做了销毁处理,我的疑问是,我对资源做了销毁处理,是不是这部分资源在虚拟机中的占用空间依旧存在,也就是并没有真正的销毁他们;
                这里谈谈自己的实践经验,如果真的是资源的问题,首先出问题的还轮不到Javaw,Eclipse马上就会出来叫嚣,告诉你没有足够的资源的可以使用,不能创建GC,字体,颜色或者是图片等等,如果还是不解决,客户端的GUI马上就会变形,变的面目全非~
        3.我现在碰到的问题还不是内存不足,或者内存溢出,而是Javaw的内存占有再不断的递增,并不是某一个恒定值区间;


        希望大家再次赐教!

客户虐我千百遍,我待客户如初恋!

posted on 2007-10-21 20:34 阿南 阅读(1263) 评论(12)  编辑  收藏 所属分类: Eclipse-RCP

评论

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-21 21:47 mingj

  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 01:34 千里冰封

还有一点,尽量用局部变量,少用成员变量,更不要把大量变量做为参数传来传去。
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~ [未登录] 2007-10-22 09:50 wzjin

如果你使用非java代码,如jni,在操作系统管理器看到的和JProfiler看到的不一样,前者可能内存占用一致增加,后这显示内存占用呈锯齿型,也就是有垃圾回收作用。你可以试试。没有用过swt,但是用过jni。
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:14 阿南

其实SWT底层就是JNI实现的,那么请问您是如何处理JNI占有大量内存的问题的?
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:27 猪儿笨笨

我做RCP比较多,给你以下几个建议
1、打开Windows的任务管理器,先看一下你的UI句柄的数量,如果过多,表示有资源没有释放
2、用TPTP之类的工具检查有无大的内存占用
3、如果是Tree的内容太多(可能性不太大),用SWT.VIRTUAL试试。

我感觉应该是代码的问题,而非SWT的问题,因为我的项目中有30万行,近百个插件,加上WTP平台都没有这个问题。
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:39 猪儿笨笨

如果你使用了图片,麻烦先在LabelProvider中的getImage返回null,看一下是不是因为图片资源的问题
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:41 阿南

是不是字体,颜色,图片对资源都有较大影响?
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:43 Matthew Chen

swt就是jni实现的,所以它dispose的时候一定就释放了系统的资源(除非swt可能有的bug),留下纯java的对象却是gc管理的,所以你确定dispose了的话问题就还在jvm内部,大的数据量一般会有缓冲机制,说到这里,不知你的程序是否依托于容器了,提供了对象缓冲池的实现,需要时获得对象,释放时直接归到池中,不作销毁,而是供下一次类似的请求直接修改并做二次使用,通过动态调整对象数量来适应不同需求。(但也可能内存占用增加就时由这部分的不合理使用产生的,看看容器有没有全局变量的使用,例如session之类的)

你上一篇中提到任务管理器显示占用增加,我觉得并不是程序在占用,而是虚拟机根据你程序使用内存的趋势不断要求系统提供更大的内存以保证程序的运行。

还有swt占用的系统资源不会由jvm管理,所以你对swt资源的释放对jvm内存占用没有影响。
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:47 阿南

恩,你的观点,我同意,JVM应该就是在帮我增加内存,以防止我再次使用更大的数据时,出现内存溢出~
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 10:57 阿南

看来,我得想办法减少大数据量的出现了~我的数据,每次都是上万的,而且是一次读取的,这个就是很可怕的~
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2007-10-22 13:09 猪儿笨笨

如果你的记录都是小的记录
一条不超过1K,应该也不是这个问题
一万条也才10M
我想应该还是有数据没有正确释放
比如上一次取得的数据还被某个static变量持有
  回复  更多评论    

# re: 再次寻求从事过Java桌面的应用的朋友解惑~  2008-07-06 23:30 三告习习

System.gc() 并不能按照你的意愿马上回收无效对象,因为激发垃圾回收操作是有条件的,这个条件不是你来决定的,而是虚拟机以它自己的算法来计算的,函数的调用起的作用好像不大。

如果是swt的话,对象要销毁与否,分为两种吧。一种是从系统里调出来的,比如System.get...,这样的对象是不需要你来销毁的,如果是你new出来的,那么你就要负责销毁它,这在于swt上特别重要,java的垃圾回收也不会帮你自动回收好像哦,因为它涉及到jni的内容,不是虚拟机能管的吧。

在swt对象中,最好每个对象都配一个dispost方法,在父容器里管理子对象,父容器被dispost时自动调用子对象的dispost方法。

我在使用使用swt时,管理资源还是比较麻烦的,还得好好研究。
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: