Tag Archives: java

遍历Map<K, Collection<V>>的正确方法

对于value为集合的map,一般直觉上我们可能会选用下面的方式遍历map中所有collection的所有对象: for(K key:map.keySet()){ for(V value:map.get(key)){ // do sth. } } 实际上,这种方式在第二行上会因为对哈希表的查询浪费效率,正确的做法应该这样: for(List<v> list:map.values()){     for(V o:list){         // do sth.     } } for(List<v> list:map.values()){ for(V o:list){ // do sth. } } 或者 for(Map.Entry<k,List<v>> entry:map.entrySet()){     for(V o:entry.getValue()){         // do sth.     } } read more »

慎用LinkedXxxx集合

这两天发现项目中有个模块有内存泄露,512 MB的堆内存大概在5个小时左右被耗尽。通过NB的profiler跟踪可以看到如下结果: java.util.concurrent.LinkedBlockingQueue.Node对象尽然占了一多半。在实时profile中发现即使限定了list的capacity并且在不断调用take方法(相当于remove)时,Node的alive object数量仍在不断增长(照理说在某个时间节点后alive object数量应该增长得很缓慢,因为take的Node对象会被GC)。将LinkedBlockingQueue换成ArrayBlockingQueue后问题解决。继而发现LinkedList有同样的问题,于是得出结论: LinkedXxxx集合的remove、take,甚至clear方法不会导致被挪出队列的node马上被标记为可GC,可能会经过一个很长的时间(generation数量相当大) 由1推测LinkedXxxx的实现可能有内存泄露,或者JVM的GC算法可能有缺陷 由1、2得出经验:在集合内容需要做频繁替换(不断add/remove或者put/take)且程序运行时间很长的情况下最好不要使用LinkedXxxx,应该用ArrayXxxx替代并且指定capacity 补:感谢blader的补充,这个问题果然是个bug:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6460501

Java RMI中的NoSuchObjectException

最近项目里的RMI在Linux下运行老出问题,而且问题出得还很不稳定。那个程序启动时会分别在4个端口上绑定4个相同的对象,结果就是有时绑定成功3个,有时候才1个……查看log,抛出下面异常 java.rmi.NoSuchObjectException: no such object in table 上网搜了一下,这篇文章给出了原因和解决方法:我在代码中做RMI绑定的时候用的是局部变量: registry.rebind(name, UnicastRemoteObject.exportObject(new RemoteObject(), 0)); registry.rebind(name, UnicastRemoteObject.exportObject(new RemoteObject(), 0)); 该局部变量在服务器端被GC后客户端再远程调用方法便会抛出上述异常。解决方法很简单,使用对远程对象的强引用以防止对象被GC,比如把局部引用改为类静态引用

在Tomcat 6中使用log4j

Tomcat 6之前,在web应用中使用log4j还算容易,只要将log4j的jar包和相应的配置文件扔到项目的class path就齐活了。但是从6开始,一切变得如此复杂…… 根据Tomcat 6 的官方文档,默认tomcat用的是JDK的logging框架,并配以“精简版”的common logging框架,即不支持common logging的底层框架自动切换功能,要使用log4j也就不可能了。要使用上述功能,需要使用“完整版”的common logging,而这个完整版的jar包apache上不提供下载,需要“自己编译tomcat代码”-_-|||,具体步骤如下: 当然,你必须得有JDK、ant、SVN(如果你直接下载源代码包,可以不需要SVN) 从http://svn.apache.org/repos/asf/tomcat/tc6.0.x/ check out代码 执行ant download 执行ant(这里提一句,源代码的编码为utf8,直接编译的话会扔一堆warning,只要改一下ant脚本里的javac task就好了,加上encoding=”utf8″) 执行ant -f extras.xml 将output/extras/tomcat-juli.jar覆盖到tomcat的bin目录下 将output/extras/tomcat-juli-adapters.jar拷到tomcat的lib目录下 在lib目录下写tomcat的全局log4j配置 在你的web项目中放入log4j.jar和log4j.properties(.xml) 附: tomcat-juli.jar tomcat-juli-adapters.jar 使用utf8编译的build.xml

让Struts 2性能提升一个数量级的的5个步骤 [zz]

原文:http://dev.yingzhitech.com/2009/01/06/96 freemarker 升级为2.3.14 ognl 升级为 2.7.3(要附加javassis类库) 根包下增加freemarker.properties文件,内容为template_update_delay=60000 struts.xml增加<constant name=”struts.devMode” value=”false”/>和<constant name=”struts.freemarker.templatesCache” value=”true”/> 把struts.xml中的默认拦截器定义为basicStack: <package name="web" extends="tiles-default">     <default-interceptor-ref name="basicStack" /> </package> <package name=”web” extends=”tiles-default”> <default-interceptor-ref name=”basicStack” /> </package> 执行了这几步之后,网站性能从5 req/s提升至70 req/s,请求处理时间从22s/req缩减至2s/req! 参考连接: http://struts.apache.org/2.x/docs/performance-tuning.html http://www.blogjava.net/usherlight/archive/2008/07/01/211869.html http://www.blogjava.net/usherlight/archive/2008/07/12/214462.html http://www.blogjava.net/usherlight/archive/2008/09/02/226501.html

如何使用J2D将一张图片灰度化

可使用以下代码: Graphics2D g2d = source.createGraphics();   ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp colorConvertOp = new ColorConvertOp(grayCS, g2d.getRenderingHints()); colorConvertOp.filter(source, source); Graphics2D g2d = source.createGraphics(); ColorSpace grayCS = ColorSpace.getInstance(ColorSpace.CS_GRAY); ColorConvertOp colorConvertOp = new ColorConvertOp(grayCS, g2d.getRenderingHints()); colorConvertOp.filter(source, source); 其中source为BufferedImage对象

How To Enable Anti-Aliased Globally Since JDK 5

I just read “Swing Hacks” and find it is that easy to enable anti-aliased since JDK 5.  Just add a one-line code listed below at the very beginning of your whole application System.setProperty("swing.aatext", "true"); System.setProperty(“swing.aatext”, “true”); That’s all

JFreeChart中的TimeSeries可能导致内存泄露

前段时间说到现在的项目里在用JFreeChart。昨天晚上走之前没把客户端关掉,今天中午到公司发现程序已经崩了,狂抛OutOfMemoryError。用NB的profiler跟了一下,发现是JFreeChart或者说是没有正确使用JFreeChart的TimeSeries导致的后果 TimeSeries有一个方法setMaximumItemAge: public void setMaximumItemAge(long periods) public void setMaximumItemAge(long periods) 该方法文档如下: Sets the number of time units in the ‘history’ for the series. This provides one mechanism for automatically dropping old data from the time series. For example, if a series contains daily data, you might set the history count to 30. Then, when you read more »

JFreeChart Developer Guide

互联网很强大,Google很强大 JFreeChart是个很强大的Java作图库,真的很强大,强大得不看文档都不知道该怎么用……JFC虽然遵循LGPL但文档是收费的,个人版45刀一份。刚才google了一下,找到一本1.0.4的PDF(最新为1.0.11),直接挂这里有点嚣张,谁要的给我mail 更新:到这儿下载吧~~

如何cancel一个swing worker(续)

上一次谈到如何去cancel一个swing worker,今天在代码里又出了问题:即使使用swingWorker.cancel(true)仍然无法在sleep时中止线程。追了一下代码,最后在javax.swing.ImageIcon类里找到了原因: protected void loadImage(Image image) { synchronized(tracker) { int id = getNextID(); tracker.addImage(image, id); try { tracker.waitForID(id, 0); } catch (InterruptedException e) { System.out.println(“INTERRUPTED while loading Image”); } loadStatus = tracker.statusID(id, false); tracker.removeImage(image, id); width = image.getWidth(imageObserver); height = image.getHeight(imageObserver); } } 其中第7行会抛出InterruptedException,而在第10行捕捉了该异常,导致InterruptedException无法抛到我的代码里。很典型的“eat-up exception”的例子。解决该问题可以在初始化ImageIcon前sleep一下,比如sleep(5),让interrupted状态在sleep中触发InterruptedException

无觅相关文章插件,快速提升流量