今天早上的Blog大家都看到了,大家的留言我也一一拜读过了~感谢 , , , , 等的回复。
下午反省了一下自己的代码,得出一下结论和疑问,有时间,请大家再讨论一下。
1.反省代码,整理所有用过的对象,特别上查询完数据库返回的上万条记录的结果集,一一将他们制空,然后再System.gc()看看效果;
2.因为是通用数据查询平台,那么结果集的展示形式是可以由实施人员自由定义的,比方说字体,颜色,图片等等,虽然我没有使用JFace对资源封装的统一标准组件,但是绝对是在使用完一一做了销毁处理,我的疑问是,我对资源做了销毁处理,是不是这部分资源在虚拟机中的占用空间依旧存在,也就是并没有真正的销毁他们;
这里谈谈自己的实践经验,如果真的是资源的问题,首先出问题的还轮不到Javaw,Eclipse马上就会出来叫嚣,告诉你没有足够的资源的可以使用,不能创建GC,字体,颜色或者是图片等等,如果还是不解决,客户端的GUI马上就会变形,变的面目全非~
3.我现在碰到的问题还不是内存不足,或者内存溢出,而是Javaw的内存占有再不断的递增,并不是某一个恒定值区间;
希望大家再次赐教!
最近在公司从事一个通用的数据查询平台的开发,是一个基于Eclipse-RCP的应用,项目现在基本进入改进和修正BUG阶段。
但是现在碰到了令人头疼的问题,程序在测试人员的机器上跑上半个多小时,整个应用程序的内存会占到300m以上,如果是做频繁的大数据查询,内存涨的更快。
我加了每分钟调用一次System.gc()的线程,唯一的改观是在Eclipse下面的内存进度显示上,会出现小范围的减少,但是从任务管理器中检视应用程序的内存,还是居高不下~
Java本身吃内存,我能理解,Eclipse-RCP也会加载大量的东西,我也能理解,大数据量的加载更可怕,我更能理解,但是无论怎么调用System.gc()都没有什么反应,我就不能理解了~
希望做过这方面的研究或者应用的朋友帮忙解答,或者谈谈经验~也可以帮助我做一些改善~
我用代码硬生生的把Eclipse-RCP丑陋的Coolbar替换掉了,但是不爽的是,Viewer上使用的是CTabFolder,而这个CTabFolder的产生,我没有办法操控,希望有高手指点。
修改代码如下:
1
package test;
2
3
import org.eclipse.swt.SWT;
4
import org.eclipse.swt.graphics.Point;
5
import org.eclipse.swt.layout.FillLayout;
6
import org.eclipse.swt.widgets.Composite;
7
import org.eclipse.swt.widgets.Shell;
8
import org.eclipse.ui.application.ActionBarAdvisor;
9
import org.eclipse.ui.application.IActionBarConfigurer;
10
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
11
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
12
import org.eclipse.ui.internal.WindowTrimProxy;
13
import org.eclipse.ui.internal.WorkbenchMessages;
14
import org.eclipse.ui.internal.WorkbenchWindowConfigurer;
15
import org.eclipse.ui.internal.layout.TrimLayout;
16
17
import com.hexapixel.widgets.generic.ColorCache;
18
import com.hexapixel.widgets.ribbon.RibbonTab;
19
import com.hexapixel.widgets.ribbon.RibbonTabFolder;
20
21
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor
{
22
23
private TrimLayout defaultLayout;
24
private Composite topComposite;
25
private WindowTrimProxy topCompositeTrim;
26
private Composite pageComposite;
27
28
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)
{
29
super(configurer);
30
}
31
32
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)
{
33
return new ApplicationActionBarAdvisor(configurer);
34
}
35
36
public void preWindowOpen()
{
37
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
38
configurer.setInitialSize(new Point(400, 300));
39
configurer.setShowCoolBar(false);
40
configurer.setShowStatusLine(false);
41
configurer.setTitle("Hello RCP");
42
}
43
44
@Override
45
public void createWindowContents(Shell shell)
{
46
shell.setBackground(ColorCache.getInstance().getColor(182, 206, 238));
47
// TODO Auto-generated method stub
48
defaultLayout = new TrimLayout();
49
defaultLayout.setSpacing(2, 2, 2, 2);
50
defaultLayout.setMargins(2, 2);
51
shell.setLayout(defaultLayout);
52
53
//topComposite
54
topComposite = new Composite(shell, SWT.None);
55
topComposite.setLayout(new FillLayout(SWT.VERTICAL));
56
topComposite.setBackground(ColorCache.getInstance().getColor(182, 206, 238));
57
58
final RibbonTabFolder ftf = new RibbonTabFolder(topComposite, SWT.NONE);
59
RibbonTab ft0 = new RibbonTab(ftf, "Home");
60
RibbonTab ft1 = new RibbonTab(ftf, "Insert");
61
new RibbonTab(ftf, "Page Layout");
62
new RibbonTab(ftf, "References");
63
64
topCompositeTrim = new WindowTrimProxy(topComposite,"org.eclipse.ui.internal.WorkbenchWindow.topBar", WorkbenchMessages.TrimCommon_Main_TrimName, SWT.NONE, true);
65
66
67
68
69
pageComposite = (Composite) ((WorkbenchWindowConfigurer) getWindowConfigurer()).createPageComposite(shell);
70
setLayoutDataForContents();
71
}
72
73
private void setLayoutDataForContents()
{
74
updateLayoutDataForContents();
75
76
}
77
78
private void updateLayoutDataForContents()
{
79
if (defaultLayout == null)
{
80
return;
81
}
82
defaultLayout.addTrim(SWT.TOP, topCompositeTrim);
83
topComposite.setVisible(true);
84
85
pageComposite.setBackground(ColorCache.getInstance().getColor(182, 206, 238));
86
defaultLayout.setCenterControl(pageComposite);
87
88
}
89
90
}
91
相信吗,这是SWT做的!这个就是Nebula项目维护者的新作~SWT Ribbon~前一段时间一直把玩的SWT Gantt也是他的作品,非常好用,功能十分强加~
读过他的代码的朋友也许都有感觉,他的代码思路非常清晰,代码量不大,但是丝丝入扣,寥寥几行就能把功能实现~高手中高手~
再赞一下Nebula的Grid,有了它,我已经不再考虑使用Table了~有时间大家都研究研究吧~
10.1忙七天,呵呵又跟5.1一样,没的休息~没办法,谁让咱们干这行了呢?老大的话就是命令,客户才不管你是死是活呢~
部门要开始新一轮的扩张了,第一批进来6个开发人员,这次又是20个毕业生免费培训,层层筛选最后留10个。这种招人的方法确实很有效果~不过最辛苦的还是我们,每天不但要拼命的赶进度,还是给学生们培训~
这次要好好的给学生们讲讲SWT和JFace,好好的给自己培养几个得力助手~
10.1结束了,大家都加油吧~
9月18日IBM放出了酝酿已久的Lotus Symphony来对抗微软,这个上世纪八十年代就出现的小子,现在又返老还童了!
今天,趁着加班的事件,网速不错,拖了回来,来感受一下Lotus Symphony的优秀,不!应该是感受一下Eclipse的优秀!
Lotus Symphony是一个基于Eclipse-RCP的应用,不过启动速度确实不敢恭维,重要的还是它的界面,确实可以和Office2007有一拼~、

主启动界面

媲美Word的Lotus Symphony Documents
虽然从功能上Lotus Symphony 和Office还差的很远,但是我们终于又看到了一个敢和微软叫板的产品了~而且还是在Eclipse基础上构建的~这点是让人兴奋的,以后再有人问我,Eclipse-RCP有什么成功的案例,我就给他看Lotus Symphony!
此外IBM为Lotus Symphony 还在Eclipse基础上做了很多的新东西,有有待于慢慢研究~传说是Lotus Symphony 是开源的,但是在官方站上并没有找到CVS或者SVN地址~这点是让人无奈的!
ORM中,一对多关系一般都是单向的,简单的说是孩子们知道自己的父亲,父亲不知道自己的儿子们,在需要的时候再去取得自己儿子们~
今天,我们加班对实体关系进行有优化,出现了一片白痴的儿子~没有一个儿子知道自己的父亲,而自己的父亲反倒知道自己的孩子们~真可怕!
我们是基于SWT的开发,所有对象取下来,其实在SWT上全是对象,什么都可以找到了~不像BS的开发,东西取下来,每一次操作都要面向一次数据,这样的修改也是很合理的~
总之今天是长见识了,白痴的儿子们万岁!
使用SWT做开发的朋友,一定要注意~资源是一个杀手!对于我们这些无知的开发人员,使用了资源,不释放它,比不写程序或者不提供这个功能还可怕~因为它经不起考验,到了时间肯定完蛋!
前两个天就遇到了这个,同事写了一个插件,一次性从数据库中取得1W以上的数据然后组织成树表格,显示给客户~取得数据的速度,树组装的速度,树展开的速度,都做了反复的优化,一切优化完成以后,就宣布完成!但是没有测,当我连续打开4个树以后,程序就非掉了~
我先加大rcp的启动内存,没用!疯狂调用cg,没用!而且这中错误错的很奇怪,如果是内存异常,应该是JVM报出的,但是这次不是,仔细阅读异常,竟然是SWT打开图片,颜色,字体的时候的异常~肯定是资源问题了!
因为以前一直再用Jface的treeviewer组件,所以一直没有关心资源的问题~但是1W的数据,使用的SWT的原生Tree组装的~而且还用了一些字体~
排查代码,竟然发现有字体被new出,但是没有释放~问题就出在这里~
调用了
Font font = new Font (display, "Courier", 10, SWT.NORMAL);
那么就应该在不在需要这个Font的时候调用
font.dispose();
两个原则:
第一条是"谁占用,谁释放",第二条是"父构件被销毁,子构件也同时被销毁"。
最近一直在忙,忙的不亦乐乎了~做了很多事情...属于商业机密,所以没有办法一一点出~
终于闲一下,维护维护Blog吧~
今天说说Eclipse3.3国际化的问题,Eclipse-RCP项目做做国际化的时候,存在两个层面,一个是控件上的中文,另一个是Plugin.xml中的中文信息,控件上的中文,没有什么可说的,用一个类,加一个资源文件就可以了~主要的问题是Plugin.xml中的中文信息;
根据各大网站和资料的中描述,Plugin.xml中中文信息用一下方法处理:
1.在Plugin.xml同目录下新建plugin.properties;
2.将Plugin.xml文件中中文部分替换成%xxxx;
不知道这样的办法是不是在Eclipse3.3以前的版本中有用,反正我在Eclipse3.3中,这招没有用,PDE可以解析到%XXX的内容,但是启动应用程序以后没有任何效果,所有修改的地方都显示为%XXX了~
解决办法就是:
请在插件的 MANIFEST.MF 文件后面添加上 Bundle-Localization: plugin 和一个回车应该可以解决你的问题。
在MF中多加一句就好了~
遇到同类问题的朋友注意了~