星期一, 二月 14, 2005
Dynamic compilation and performance measurement
Dynamic compilation and performance measurement 大意大概是:
目前 Java 的 HotSpot JVM 是在程式執行過程中,選擇性地將執行得最頻繁的程式部分編譯成 machine code 並作最佳化,而且還會持續根據程式執行過程得到的資料,將某些已經轉成 machine code 的部分重新編譯和作更進一步的最佳化,然後取代掉先前編譯好的 machine code。這些編譯和置換動作都需要花時間,而且無法確定什麼時候發生,使得要測量程式碼執行速度時,測到的通常不是想測的東西。
另外,加上參數 -server 執行的 server VM,會作更多清除不必要程式碼的動作,所以以 server VM 執行得到的測量結果遠遠快於預設 client VM 的情形,很有可能是大部分的程式碼都被精簡掉了,而不是 server VM 真的那麼快。
很值得讀的好文章。
星期二, 十月 12, 2004
Developing Games in Java 裡不好的 Thread 例子
翻了一下這本書 Developing Games in Java
在第一章看到像這樣的程式
public class MyClass extends SomeOtherClass implements Runnable {
public MyClass() {
Thread thread = new Thread(this);
thread.start();
}
public void run() {
System.out.println("Do something cool here.");
}
}
作者可能沒看過 Safe construction techniques 這篇文章因為在 constructor 裡傳 this 給新 thread 並讓它開始執行
可能會使物件在還沒完全建構好前就被新 thread 用到,是應該避免的寫法
我沒有說這本書不好的意思,因為才看了一點點而已。只是提醒自己像這樣的地方要留意,不要看書上有這麼寫,就跟著寫。
星期一, 九月 27, 2004
DrJava 的 Interactions Pane 很好玩
DrJava - http://drjava.sourceforge.net/
一個小型的 Java IDE,有個很棒的功能 - Interactions Pane
例如依序輸入下面三行
import javax.swing.*;
JFrame frame = new JFrame("My JFrame");
frame.setVisible(true);
在第三行輸入完按 Enter 後就會有個 JFrame 出現 Figure 1
然後加入一個 JLabel
frame.getContentPane().add(new JLabel("DrJava Test"));
frame.pack();
把 JLabel 拿掉
frame.getContentPane().removeAll();
frame.pack();
如果沒有加分號,會把那行的東西印出來,像是接著只打 frame 按 Enter,會印出前面宣告的 JFrame 的資料
它還有提供一個 Eclipse Plugin,功能是可以在 Eclipse 裡使用 Interactions Pane
目前的 0.9.5 版有點小問題,解開壓縮檔之後要先編輯它的 plugin.xml 檔案
把這幾行
<requires>
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.debug.ui"/>
<import plugin="org.eclipse.jdt.ui"/>
<import plugin="org.eclipse.jdt.core"/>
<import plugin="org.eclipse.console.ui"/>
</requires>
改成
<requires>才不會開 DrJava 的 perspective 時出錯
<import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.debug.ui"/>
<import plugin="org.eclipse.jdt.ui"/>
<import plugin="org.eclipse.jdt.core"/>
<import plugin="org.eclipse.ui.console"/>
<import plugin="org.eclipse.core.runtime.compatibility"/>
<import plugin="org.eclipse.search"/>
</requires>
(如果改完還看不到可以開的 perspective 裡有 DrJava,用 -clean 參數重新啟動 Eclipse)
星期二, 九月 07, 2004
EMMA - opensource 的 Java code coverage 工具
EMMA - http://emma.sourceforge.net/
第一次知道 code coverage 這詞好像是因為看到一些 project 使用 Clover
不過 Clover 不是免費的,所以沒有仔細看或抓來試玩
只得到一個印象:可以用來知道 JUnit 寫的之類的測試程式,測試到了主要程式的多少部份
現在知道有個 opensource 的 EMMA, 看了它的 Quick Start 發現還可以配合這工具執行 GUI 程式
把程式的功能試一試之後,會產生記錄顯示剛才的操作(手動測試?)執行到多少部份的程式碼
有點意外可以這樣玩 ![]()
取得測試程式的測試涵蓋範圍的方法,則在 Sample Reports 的第一項 Velocity 有個簡單的執行步驟
詳細還是要看 Documentation,只是不知道我什麼時候才會用到
第一次和到目前唯一一次有寫 test,是暑假前那學期做的一個作業
寫的東西太少了,而且有時都暴力去做,懶得弄測試 ![]()
最後,
技術人部落有一篇 EMMA 的文章 - http://203.204.88.244/post/1/16
星期三, 九月 01, 2004
FindBugs - 偵測程式碼裡的潛在問題
http://findbugs.sourceforge.net/
可以找出程式碼裡可能存在的 這麼多問題
而且有多種使用方式:文字模式、GUI 模式、Ant task、Eclipse plug-in 等等
寫了一堆好文章的 Brian Goetz 在 Kill bugs dead 這篇文章裡
摘要出他以前文章談到的 Java 程式問題,然後說明 FindBugs 對這些問題的偵測
文章裡有那些舊文章的連結,還有
這裡就不列出來了
星期四, 八月 26, 2004
JDK 5.0 的好玩工具
JDK 5.0 多了不少好玩的東西
像在 command line 下打 jps 會列出 Java 行程
12063 Jps
11862 Main
10739 jedit.jar
前面的數字是 process id (pid)
用 jinfo pid 可以列出該行程的一些 Java 設定資料
jmap -histo pid 顯示這樣的東西
Object Histogram:
Size Count Class description
-------------------------------------------------------
4018800 340 int[]
412632 4287 * ConstMethodKlass
242616 4287 * MethodKlass
221776 6147 * SymbolKlass
156056 301 * ConstantPoolKlass
110128 283 * ConstantPoolCacheKlass
107480 301 * InstanceKlassKlass
67440 312 byte[]
62504 572 char[]
32384 368 java.lang.Class
25888 436 short[]
分別是各類型物件所佔記憶體大小、數量、所屬 Class (int[] 佔那麼多是因為我宣告了一個大小一百萬的陣列)
jmap -heap pid 則會顯示 heap 的相關資料
詳細資料在 http://java.sun.com/j2se/1.5.0/docs/tooldocs/index.html
最底下的兩大類 Monitoring and Management Tools 和 Troubleshooting Tools
星期五, 元月 30, 2004
Velocity 一個奇怪的結果
#set( $foo = "bar" )
$!{foo}
照文件上寫的結果應該是
$!{foo}
但實際出現的是
$!{
下載的 1.4rc1 和從 cvs build 的 1.5dev 都是這樣
