JRE 與 JDK ,JVM Client Server瞭解

 

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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章