SVN 下載地址 http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91
jstat
1. jstat -gc pid
可以顯示gc的信息,查看gc的次數,及時間。
其中最后五項,分別是young gc的次數,young gc的時間,full gc的次數,full gc的時間,gc的總時間。
2.jstat -gccapacity pid
可以顯示,VM內存中三代(young,old,perm)對象的使用和占用大小,
如:PGCMN顯示的是最小perm的內存使用量,PGCMX顯示的是perm的內存最大使用量,
PGC是當前新生成的perm內存占用量,PC是但前perm內存占用量。
其他的可以根據這個類推, OC是old內純的占用量。
3.jstat -gcutil pid
統計gc信息統計。
4.jstat -gcnew pid
年輕代對象的信息。
5.jstat -gcnewcapacity pid
年輕代對象的信息及其占用量。
6.jstat -gcold pid
old代對象的信息。
7.stat -gcoldcapacity pid
old代對象的信息及其占用量。
8.jstat -gcpermcapacity pid
perm對象的信息及其占用量。
9.jstat -class pid
顯示加載class的數量,及所占空間等信息。
10.jstat -compiler pid
顯示VM實時編譯的數量等信息。
11.stat -printcompilation pid
當前VM執行的信息。
一些術語的中文解釋:
S0C:年輕代中第一個survivor(幸存區)的容量 (字節)
S1C:年輕代中第二個survivor(幸存區)的容量 (字節)
S0U:年輕代中第一個survivor(幸存區)目前已使用空間 (字節)
S1U:年輕代中第二個survivor(幸存區)目前已使用空間 (字節)
EC:年輕代中Eden(伊甸園)的容量 (字節)
EU:年輕代中Eden(伊甸園)目前已使用空間 (字節)
OC:Old代的容量 (字節)
OU:Old代目前已使用空間 (字節)
PC:Perm(持久代)的容量 (字節)
PU:Perm(持久代)目前已使用空間 (字節)
YGC:從應用程序啟動到采樣時年輕代中gc次數
YGCT:從應用程序啟動到采樣時年輕代中gc所用時間(s)
FGC:從應用程序啟動到采樣時old代(全gc)gc次數
FGCT:從應用程序啟動到采樣時old代(全gc)gc所用時間(s)
GCT:從應用程序啟動到采樣時gc用的總時間(s)
NGCMN:年輕代(young)中初始化(最小)的大小 (字節)
NGCMX:年輕代(young)的最大容量 (字節)
NGC:年輕代(young)中當前的容量 (字節)
OGCMN:old代中初始化(最小)的大小 (字節)
OGCMX:old代的最大容量 (字節)
OGC:old代當前新生成的容量 (字節)
PGCMN:perm代中初始化(最小)的大小 (字節)
PGCMX:perm代的最大容量 (字節)
PGC:perm代當前新生成的容量 (字節)
S0:年輕代中第一個survivor(幸存區)已使用的占當前容量百分比
S1:年輕代中第二個survivor(幸存區)已使用的占當前容量百分比
E:年輕代中Eden(伊甸園)已使用的占當前容量百分比
O:old代已使用的占當前容量百分比
P:perm代已使用的占當前容量百分比
S0CMX:年輕代中第一個survivor(幸存區)的最大容量 (字節)
S1CMX :年輕代中第二個survivor(幸存區)的最大容量 (字節)
ECMX:年輕代中Eden(伊甸園)的最大容量 (字節)
DSS:當前需要survivor(幸存區)的容量 (字節)(Eden區已滿)
TT: 持有次數限制
MTT : 最大持有次數限制
sun 官方文檔 http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html
我們先來安裝Scala的開發包,我的版本是scala-2.9.0.1.zip,安裝方式解壓就可以,環境變量和Jdk的沒什么區別,指向到bin目錄下就可以了,打開dos窗口,運行scala,出現下面結結果就表示安裝成功了

好了,讓我們開始Scala之旅吧。
在Scala中,分號是可選的,你可以寫或者不寫;定義類和構造函數,Java中一般這么寫
- public class MyTest {
- private int id;
- private int index;
- public MyTest(int id, int index) {
- this.id = id;
- this.index = index;
- }
- }
而在Scala中,可以這么寫
除了這些特性,尤其值得一提的是Scala是靜態類型的語言,它支持指令式的編程,但更推薦的使用函數式的編程。比如下面的代碼
- object HelloWorld {
- def main(args: Array[String]): Unit = {
- var i = 0
- while(i < args.length) {
- println(args(i))
- i += 1
- }
- }
- }
我可以使用scalac HelloWorld.scala使他生成class字節碼,也可以直接在JVM上執行,
scala HelloWorld.scala Hello World
打印結果將是 Hello World
大家不覺得這樣有一丁點兒復雜嗎,來看看Scala的函數式的編程是什么樣的
- object HelloWorld {
- def main(args: Array[String]): Unit = {
- args.foreach(arg => print(arg + " "))
- }
- }
arg就是你臨時定義的變量,Scala默認為其開辟了臨時的String變量arg。
體驗了最初的簡單函數式風格,我們再看下Scala中如何使用數組,在Java中,使用一個最簡單數組是這樣的
- public class ArrayTest {
- public static void main(String[] args) {
- String[] strs = new String[]{"Hello", "World", "!"};
- for(String str : strs) {
- System.out.println(str);
- }
- }
- }
在Scala中,同樣是通過new來實例化對象,實例化過程中,可以用值和類型使對象參數化,使用值參數化實例可以通過把值傳遞給構造器的圓括號來實現,比如,Scala中數組是這么實現的,值得一提的是,在Scala中,數組是可變數據結構,這是和Java中有區別的地方
- object ArrayTest {
- def main(args: Array[String]): Unit = {
- var greetString = new Array[String](3)
- greetString(0) = "Hello"
- greetString(1) = "World"
- greetString(2) = "!"
- for(i <- 0 to 2) {
- println(greetString(i))
- }
- }
- }
i <- 這個表達式是表示左邊的涵蓋在右邊范圍之內。
下面我們來看看List,在Java中,List是可變的結構序列,而在Scala中,List是不可變的,在Scala中,List是不可變的數據結構,這么設計是為了函數式編程而設計的,奇特的是,Scala中并不需要通過new來創建List對象,比如下面一個例子,我創建了兩個集合,并且把它們循環打印出來。
- def main(args: Array[String]): Unit = {
- var list1 = List("aaa", "bbb", "ccc")
- var list2 = List("ddd")
- var list3 = list1 ::: list2
- list3.foreach(list => print(list + " "))
- }
打出的結果就是 aaa bbb ccc ddd
我們再來看看Set和Map,Scala致力于充分利用函數式和指令式兩方面的好處,所以它的集合庫區分為可變型和不可變型,都承接與Set,他們分別在Scala的不同包里。在Java中,我們稱為“實現”了接口,而在Scala中,我們稱為“擴展”或“混入”,下面我分別用Scala中的HashSet和HashMap的不可變數據類型,來做例子
- object SetTest {
- def main(args: Array[String]): Unit = {
- var set = HashSet("b", 3, "c")
- set += "very"
- set.foreach(value => print(value + " "))
- }
- }
這是Set的,下面是關于Map的
- object MapTest {
- def main(args: Array[String]): Unit = {
- var map = HashMap(1 -> "a", 2 -> "b", 3 -> "c")
- map += (4 -> "d")
- map.foreach(value => print(value + " "))
- }
- }
Scala的程序,只要后綴名命名為.scala就可以了。同時Eclipse也內置了對Scala的支持,安裝插件的網址是http://download.scala-ide.org/nightly-update-wip-experiment-2.9.0.final
大家可以自行安裝,安裝完后就可以在Eclipse中運行了,如下圖

現在對函數式編程有個了最初體會了
Amino CBB (Concurrent Building Blocks) 類庫將提供優化后的并發線程組件,適用于JDK6.0 及其以后的版本。
Amino Java 類庫將涉及下面四個方面的內容:
1) 數據結構
該組件將提供一套免鎖的集合類。因為這些數據結構采用免鎖的運算法則來生成,所
以,它們將擁有基本的免鎖組件的特性,如可以避免不同類型的死鎖,不同類型的線程初始
化順序等。
2) 并行模式
Amino 將為應用程序提供一個或幾個大家熟知的并行計算模式。采用這些并行模式可
以使開發者起到事半功倍的效果,這些模式包括 Master-Worker、Map-reduce、Divide and
conquer, Pipeline 等,線程調度程序可以與這些模式類協同工作,提供了開發效率。
3) 并行計算中的一般功能
Amino 將為應用程序提供并行計算中常用的方法,例如:
a. String、Sequence 和Array 的處理方面。如Sort、Search、Merge、Rank、Compare、
Reverse、 Shuffle、Rotate 和Median 等
4)原子和STM(軟件事務內存模型)
--------------------------------
在Amino 類庫中,主要算法將使用鎖無關的(Lock-Free)的數據結構。
原語Compare-and-swap(CAS) 是實現鎖無關數據結構的通用原語。CAS 可以原子
地比較一個內存位置的內容及一個期望值,如果兩者相同,則用一個指定值取替這個內存位
罝里的內容,并且提供結果指示這個操作是否成功。
CAS 操作過程是:當處理器要更新一個內存位置的值的時候,它首
先將目前內存位置的值與它所知道的修改前的值進行對比(要知道在多處理的時候,你要更
新的內存位置上的值有可能被其他處理更新過,而你全然不知),如果內存位置目前的值與
期望的原值相同(說明沒有被其他處理更新過),那么就將新的值寫入內存位置;而如果不
同(說明有其他處理在我不知情的情況下改過這的值咯),那么就什么也不做,不寫入新的
值(現在最新的做法是定義內存值的版本號,根據版本號的改變來判斷內存值是否被修改,
一般情況下,比較內存值的做法已經滿足要求了)。CAS 的價值所在就在于它是在硬件級別
實現的,速度那是相當的快。
- 要想深入了解Java必須對JDK的組成, 本文對JDK6里的目錄做了基本的介紹,主要還是講解
- 了下JDK里的各種可執行程序或工具的用途
- Java(TM) 有兩個平臺 JRE 運行平臺,包括Java虛擬機,運行類庫,java應用程序裝載器。
- JRE不是開發環境,所以不包括編譯器,調試器,有需要這些請安裝JDK(TM)
- //說明 :環境為Windows XP SP3 下 的JDK為1.60版本 JAVA_HOME = C:\jdk1.6.0
- //---------------------------開發文件和目錄---------------------------------------
- jdk1.6.0
- ___________|____________________
- | | |
- bin lib jre
- | | __________|____________________
- java.exe tools.jar | |
- javac.exe dt.jar bin lib
- javap.exe _____|____ __________ _______|_____ _______ ______
- javah.exe | | | | | | | |
- javadoc.exe java.exe client server rt.jar ext security applet fonts
- java.dll | | charsets.jar|
- awt.dll jvm.dll jvm.dll localedata.jar
- c:\jdk1.6.0 -- JDK的根目錄,包含一些軟件版權,聲明,和自述文件,
- 同時包含歸檔了的Java平臺源代碼包src.zip
- c:\jdk1.6.0\bin -- JDK包含的一些開發工具執行文件
- c:\jdk1.6.0\jre\bin\client
- 包含 Java HotSpotTM Client Virtual Machine 要用的 DLL 文件
- c:\jdk1.6.0\jre\bin\server
- 包含 Java HotSpotTM Server Virtual Machine 要用的 DLL 文件
- c:\jdk1.6.0\lib -- Java開發工具要用的一些庫文件,有包含了支持JDK工具的非核心類庫tool.jar,
- dt.jar 歸檔的 BeanInfo 文件
- 用于告訴IDE這樣顯示java組件怎樣讓開發者在自己的應用程序中用戶化它們
- c:\jdk1.6.0\jre -- JDK使用的Java運行環境(JRE)的根目錄,這個運行環境實現了Java平臺
- c:\jdk1.6.0\jre\bin -- Java平臺所要用的工具和庫的可執行文件
- 這些可執行文件和 /jdk1.6.0/bin相同的。
- //Java 啟動器工具充當了應用程序啟動器(覆蓋了1.1版本的JDK推出的舊版本JRE工具)
- 這個路徑不需要設置 PATH 環境變量
- c:\jdk1.6.0\jre\bin\client -- 包含Java Hotspot(Java性能引擎) 客戶虛擬機要用的DLL文件
- c:\jdk1.6.0\jre\bin\server -- 包含Java Hotspot(Java性能引擎) 服務器虛擬機要用的DLL文件
- c:\jdk1.6.0\jre\lib -- JRE要用的代碼庫,屬性設置,資源文件。
- 例如rt.jar Java 引導類庫(java 核心APIRunTime類)
- charsets.jar 字符轉換類庫
- c:\jdk1.6.0\jre\lib\ext -- 默認的Java平臺擴展安裝環境
- 包含localedata.jar 是 ava.text 和 java.util包要用到的地區數據
- c:\jdk1.6.0\jre\lib\security -- 包含安全管理文件,有安全規則(java.policy)
- 和安全屬性文件(java.security)
- c:\jdk1.6.0\jre\lib\applet -- Java applets 要的Jar包,可以放到lib/applet/目錄,
- 這樣可以節省 applet 類裝載器從本地文件系統裝載 大的applets 所需的applet類時間
- 減少從網上下載具有相同的保護的時間。
- c:\jdk1.6.0\jre\lib\fonts 包含平臺所需的TrueType字體文件
- //不知道大家的版本有沒有這個目錄
- -db目錄 純Java開發的數據可 Derby,是一個開源的100%Java開發的關系數據庫
- db
- _________|__________
- | | |
- Demo Frameworks lib
- -Dmeo 是Java Derby的例子程序
- -Frameworks 提供數據庫運行時需要的用到的shell腳本,包括Windows下的bat和Unix下的Ksh
- 包含 Java DB 的類庫和 Sun Microsystems 的 Apache Derby 數據庫技術的分發
- 有關 Java DB 的信息,請參見 http://developers.sun.com/prodtech/javadb/。
- 有關 Derby 的文檔,請參見:http://db.apache.org/derby/manuals/index.html
- //----------------------------附加的文件和目錄------------------------------------
- jdk1.6.0
- ___________|__________ ___________
- | | | |
- demo include src.zip sample
- ___|___ _________ __________
- | | | |
- applets jfc jpda plugin
- c:\jdk1.6.0\src.zip -- 歸檔的Java源代碼
- c:\jdk1.6.0\demo -- Java編程的例子
- c:\jdk1.6.0\demo\applets -- 網頁Applets的例子
- c:\jdk1.6.0\demo\jfc -- Java 2D(TM)和JFC(基礎圖形類集合)\Swing 功能的例子
- c:\jdk1.6.0\demo\jpda -- 用Java平臺Debugging的體系構架,包還有javadt 的 jdb 源代碼,
- 具體內容可看jpda目錄下的doc\index.html
- c:\jdk1.6.0\demo\jvmti -- java虛擬機tool interface (工具接口) 實例代碼
- c:\jdk1.6.0\demo\plugin -- java 插件產品案例
- c:\jdk1.6.0\demo\nbproject -- JDK的 netbean工程示例
- c:\jdk1.6.0\demo\management -- 一些這樣查看死鎖線程(FullThreadDump ),
- 收集垃圾(VerboseGC)內存cpu使用狀況了代碼例子。詳細可查看目錄下的index.html
- c:\jdk1.6.0\sample -- 某些 Java API 的編程樣例(帶源代碼)。
- //有興趣的可看看上面這些代碼,很有用
- c:\jdk1.6.0\include -- C 語言頭文件 支持 用Java本地接口和Java虛擬機接口 來本機代碼編程
- //-----------------------------------基本工具-------------------------------------
- 這些工具是JDK的基礎,用這些工具來編寫應用程序。
- javac.exe -- Java語言編譯器
- java.exe -- Java應用程序啟動器,JDK 1.6版里同時用于開發和部署,
- 舊的部署啟動器,jre,不在提供
- javadoc.exe -- Java API 文檔生成器
- apt.exe -- java 注釋處理器
- appletviewer.exe -- java applet 小程序查看器
- jar.exe -- java文件壓縮打包工具
- jdb.exe -- Java 調試器.
- javah.exe -- C 頭文件和stub生成器,用于寫本地化方法,例如生產JNI樣式的頭文件
- javap.exe -- class文件 反編譯工具
- extcheck.exe -- 用于檢測jar包中的問題
- //---------------------------------安全工具 --------------------------------------
- 這些工具用于設置系統的安全規則和生產可以工作在遠端的安全規則下的應用程序
- keytool.exe -- 管理密鑰庫和證書.
- jarsigner.exe -- 生產和校驗JAR簽名
- policytool.exe -- 有用戶界面的規則管理工具
- kinit.exe.exe -- 用于獲得和緩存網絡認證協議Kerberos 票證的授予票證
- klist.exe.exe -- 憑據高速緩存和密鑰表中的 Kerberos 顯示條目
- ktab.exe.exe-- 密鑰和證書管理工具
- //--------------------------------Java國際化工具----------------------------------
- 這些工具可以幫助你創建可本地化的應用程序
- native2ascii -- 見文本轉化為 Unicode Latin-1。//這個工具很有意思 ,大家可以看看這里
- //http://java.sun.com/javase/6/docs/technotes/tools/windows/native2ascii.html
- //--------------------------------遠程方法調用工具--------------------------------
- 這些工具可以幫助創建可以和web和網絡交互的應用程序
- rmic.exe -- 生成遠程對象的stubs and skeletons(存根和框架)
- rmid.exe -- Java 遠程方法調用(RMI:Remote Method Invocation) 活化系統守護進程
- rmiregistry.exe -- Java 遠程對象注冊表
- serialver.exe -- 返回類的 serialVersionUID.
- //------------------------------Java IDL and RMI-IIOP 工具------------------------
- 這些工具用于創建使用OMG-Standard IDL 和 CORBA/IIOP 的應用程序
- tnameserv.exe -- Provides access to the naming service.
- idlj.exe -- 生產映射到OMG IDL接口可以使Java應用程序使用CORBA的.java文件
- orbd.exe -- 為客戶可以在CORBA環境下透明的定位和調用服務器的穩定的對象提供支持
- servertool.exe -- 為應用程序提供易于使用的接口用于注冊,注銷,啟動,關閉服務器
- //-------------------------------Java 部署工具------------------------------------
- pack200.exe -- 使用java gzip壓縮工具將JAR文件轉換為壓縮的pack200文件,
- 生產打包文件是高度壓縮的JAR包,可以直接部署,減少下載時間
- unpack200.exe -- 解包pack200文件為JARs
- //-------------------------------Java 插件工具------------------------------------
- htmlconverter.exe -- Java Plug-in HTML轉換器 htmlconverter -gui 可以啟動圖形界面
- //-------------------------------Java web 啟動工具--------------------------------
- javaws.exe -- Java web 啟動命令行工具
- //-----------------------Java 故障檢修,程序概要分析,監視和管理工具--------------
- jvisualvm.exe -- 一個圖形化的Java虛擬機,不說了 大家研究一下就發現太酷了
- // 啊這是想了解JVM的人的神器
- //http://java.sun.com/javase/6/docs/technotes/guides/visualvm/index.html
- jconsole.exe -- java監視臺和管理控制臺,圖形界面的功能太強大了,
- 運行一下就知道 ,不想多說,看了就知道
- //------------------------------Java web 服務工具---------------------------------
- schemagen.exe -- Java構架的XML Schema生成器
- wsgen.exe -- 生成 JAX-WS
- wsimport.exe -- 生成 JAX-WS
- xjc.exe -- 綁定編譯器
- //------------------------------監視工具------------------------------------------
- 監視Java虛擬機的性能,不支持Windows 98 和Windows ME 平臺
- jps.exe -- JVM Process Status 進程狀態工具。列出目標系統的HotSpot JJVM
- jstat.exe -- 按照命令行的具體要求記錄和收集一個JVM的性能數據
- jstatd.exe -- JVM jstat 的守護進程
- //-----------------------------故障檢測和修理工具---------------------------------
- jinfo.exe -- 配置或打印某個Java進程VM flag
- jhat.exe -- 堆儲存查看器
- jmap.exe -- Java內存圖
- jsadebugd.exe -- Java 的 Serviceability Agent Debug的守護進程
- jstack.exe -- Java堆棧跟蹤
- //----------------------------Java腳本工具----------------------------------------
- jrunscript.exe -- 運行腳本
- //工具都在JAVA_HOME\bin目錄下,絕大部分工具都有-help命令行參數來提供幫助
一點歷史