JRE 與 JDK ,JVM Client Server瞭解
一、JRE: java runtime environment java 運行環境
JRE是運行java所需要的環境。包含JVM標準實現和JAVA核心類庫,以及javaplug-in。
可以在JRE上進行運行、測試和傳輸應用程序。JRE不包括編譯器,調試器和其他工具。
也就是說,如果直接運行一個java編譯好了的class文件,使用JRE就OK 了。
但是如果你要開發一個java文件,然後對它進行編譯,調試等工作,這個時候就要用到JDK 了。
二、JDK: java development kit java 開發工具包
java開發人員對這個並不陌生,在創建開發環境的時候首要安裝的就是JDK,配置環境變量JAVA_HOME ,指向JDK。
在安裝JDK的後,你會發現jdk的目錄下有一個jre的目錄,也就是說,JDK裏面包含一個JRE。這樣開發了的程序可以編譯後直接運行了。
JDK 有三種版本,常說的J2EE(java 2 platform Enterprise edition),J2SE(java 2 platform standyard edition),
J2ME(java 2 platform micro edition)就是說的JDK 的版本。
JDK 除了核心的java api庫和jre外,還包括一些程序組成的工具庫(jdk的安裝目錄bin下可以看到),在這裏挑幾個簡單瞭解下:
1.javac:java的編譯器,可以將java文件編譯成字節碼
2.java: java的解釋器,可以將字節碼進行解釋運行。
3.jdb: java 調試器,可以設置斷點和檢查變量,逐行運行程序。
4.javah:產生可以調用java過程的c過程,或建立能被java程序調用的C過程頭文件。這個我沒用過。暫時理解爲C 與 java之間的翻譯吧。
5.Javap:java反彙編器,顯示編譯類文件中的可訪問功能和數據,同時顯示字節碼的含義。其實個人感覺叫javap反彙編或反編譯器比較彆扭。
因爲javap畢竟不像其他的反編譯工具一樣將class文件的直接轉成java文件,而只能顯示方法的名稱,不包括具體實現。
我感覺javap還是作爲解釋class文件的。如果你沒有這個class文件的api,沒有ide,想在命令行操作裏面查看這個class文件都包括什麼方法
那javap還是很簡單操作的,例如:
[root@kaifa02 ~]# javap -private java.lang.Object
Compiled from "Object.java"
public class java.lang.Object{
public java.lang.Object();
private static native void registerNatives();
public final native java.lang.Class getClass();
public native int hashCode();
public boolean equals(java.lang.Object);
protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
public java.lang.String toString();
public final native void notify();
public final native void notifyAll();
public final native void wait(long) throws java.lang.InterruptedException;
public final void wait(long, int) throws java.lang.InterruptedException;
public final void wait() throws java.lang.InterruptedException;
protected void finalize() throws java.lang.Throwable;
static {};
}
javap 根據傳遞的不同參數展示不同的內容,可以使用javap -help來查看具體參數的使用,參數很少,也比較簡單
[root@kaifa02 ~]# javap -help
Usage: javap <options> <classes>...
where options include:
-c Disassemble the code
-classpath <pathlist> Specify where to find user class files
-extdirs <dirs> Override location of installed extensions
-help Print this usage message
-J<flag> Pass <flag> directly to the runtime system
-l Print line number and local variable tables
-public Show only public classes and members
-protected Show protected/public classes and members
-package Show package/protected/public classes
and members (default)
-private Show all classes and members
-s Print internal type signatures
-bootclasspath <pathlist> Override location of class files loaded
by the bootstrap class loader
-verbose Print stack size, number of locals and args for methods
If verifying, print reasons for failure
6. Jconsole: Java進行系統調試和監控的工具
7.jstat : 對jvm的內存使用量進行監控,感覺這個東西很好,正好這幾天看java虛擬機,如果不安裝其他工具,使用jstat就可以監控到jvm內容使用的情況和GC狀況,對於jvm調優很有幫助:
8.jmap - Memory Map: Prints shared object memory maps or heap memory details of a given JVM process or a Java core file on the local machine or on a remote machine through a debug server。
jmap 能夠打印出jvm的內存使用詳情,也可以把這些詳情輸出到特定的文件中進行分析
[root@kaifa02 ~]# jmap -heap 3876
Attaching to process ID 3876, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 10.0-b22
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 1048576 (1.0MB)
MaxNewSize = 4294901760 (4095.9375MB)
OldSize = 4194304 (4.0MB)
NewRatio = 8
SurvivorRatio = 8
PermSize = 16777216 (16.0MB)
MaxPermSize = 67108864 (64.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 123797504 (118.0625MB)
used = 25266160 (24.095687866210938MB)
free = 98531344 (93.96681213378906MB)
20.40926447111567% used
From Space:
capacity = 1900544 (1.8125MB)
used = 0 (0.0MB)
free = 1900544 (1.8125MB)
0.0% used
To Space:
capacity = 20447232 (19.5MB)
used = 0 (0.0MB)
free = 20447232 (19.5MB)
0.0% used
PS Old Generation
capacity = 954466304 (910.25MB)
used = 19873888 (18.953216552734375MB)
free = 934592416 (891.2967834472656MB)
2.0821990170540374% used
PS Perm Generation
capacity = 67108864 (64.0MB)
used = 35417304 (33.776573181152344MB)
free = 31691560 (30.223426818847656MB)
52.77589559555054% used
9.native2ascii 可以將目標文件轉成unicode 編碼,或者將unicode編碼的文件還原成本地編碼,也可以指定編碼進行轉換。
========================== JVM 相關 =======================
下面整理一下對JVM client 和server 的一點點了解:
JVM如果不顯式指定是-Server模式還是-client模式,JVM能夠根據下列原則進行自動判斷(適用於Java5版本或者Java以上版本)。
J2SE5.0檢測的根據是至少2個CPU和最低2GB內存。
1 jvm server比jvm client 更優化,性能更好.
2 jvm server 啓動較慢但啓動後運行速度較快。jvm client 啓動較快。
3 jvm client 中能運行的可能在jvm server中運行出錯 ,所以這樣的話最好在開發、測試階段都使用jvm server ,保持和服務器相同。
當JVM用於啓動GUI界面的交互應用時適合於使用client模式
當JVM用於運行服務器後臺程序時建議用Server模式。
ps:java -version 來查看jvm默認工作在什麼模式
JVM Client
C:\Documents and Settings\Administrator>java -version
java version "1.6.0_21"
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)
Java HotSpot(TM) Client VM (build 17.0-b16, mixed mode, sharing)
JVM Server
[root@kaifa02 ~]# java -version
java version "1.6.0_06"
Java(TM) SE Runtime Environment (build 1.6.0_06-b02)
Java HotSpot(TM) Server VM (build 10.0-b22, mixed mode)