『壹』 什麼是java虛擬機
虛擬機是一種抽象化的計算機,通過在實際的計算機上模擬模擬各種計算機功能來實現的。
Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。
這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專注寫java代碼就可以了,這也正是虛擬機之所以存在的原因--屏蔽底層操作系統平台的不同並且減少基於原生語言開發的復雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。
從進程的角度解釋JVM
讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。
對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,載入對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。
首先編寫C語言版的HelloWorld程序。
總結
寫到這里,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不「深入」,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:
《深入Java虛擬機》
《深入理解Java虛擬機JVM高級特性與最佳實踐》
《Java虛擬機規范》
其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而復雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。
最後做一個總結:
1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。
2 這個叫做虛擬機的進程比較特殊,它能夠載入我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。
3 載入class文件的是一個叫做類載入器的子系統。就好比我們的嘴巴,把食物吃到肚子里。
4 虛擬機中的執行引擎用來執行class文件中的位元組碼指令。就好比我們的腸胃,對吃進去的食物進行消化。
5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。
(1)java虛擬機啟動擴展閱讀:
關於JAVA虛擬機的參數說明如下:
1、運行class文件
執行帶main方法的class文件,Java虛擬機[3]命令參數行為:
java <CLASS文件名>
注意:CLASS文件名不要帶文件後綴.class
例如:
java Test
如果執行的class文件是帶包的,即在類文件中使用了:
package <;包名>
那應該在包的基路徑下執行,Java虛擬機命令行參數:
java <;包名>.CLASS文件名
例如:
PackageTest.java中,其包名為:com.ee2ee.test,對應的語句為:
package com.ee2ee.test;
PackageTest.java及編譯後的class文件PackageTest.class的存放目錄如下:
classes
|__com
|__ee2ee
|__test
|__PackageTest.java
|__PackageTest.class
要運行PackageTest.class,應在classes目錄下執行:
java com.ee2ee.test.PackageTest
2、運行jar文件中的class
原理和運行class文件一樣,只需加上參數-cp <jar文件名>;即可。
例如:執行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:
java -cp test.jar com.ee2ee.test.PackageTest
3、顯示JDK版本信息
當一台機器上有多個jdk版本時,需要知道當前使用的是那個版本的jdk,使用參數-version即可知道其版本,命令行為:
java -version
4、增加虛擬機可以使用的最大內存
Java虛擬機可使用的最大內存是有限制的,預設值通常為64MB或128MB。
如果一個應用程序為了提高性能而把數據載入內存中而佔用較大的內存,比如超過了默認的最大值128MB,需要加大java虛擬機可使用的最大內存,否則會出現Out of Memory的異常。啟動java時,需要使用如下兩個參數:
-Xms java虛擬機初始化時使用的內存大小
-Xmx java虛擬機可以使用的最大內存
以上兩個命令行參數中設置的size,可以帶單位,例如:256m表示256MB
舉例說明:
java -Xms128m -Xmx256m ...
表示Java虛擬機初始化時使用的內存為128MB,可使用的最大內存為256MB。
對於tomcat,可以修改其腳本catalina. sh(Unix平台)或catalina.bat(Windows平台),設置變數JAVA_OPTS即可,例如:
JAVA_OPTS='-Xms128m -Xmx256m'
『貳』 如何啟動java虛擬機
配置環境變數。
右擊「我的電腦」->屬性->高級->環境變數,在「系統變數」中設置變數名為JAVA_HOME,值為JDK安裝路徑,一般為C:\Program Files\Java\jdk***;然後在path變數中添加%JAVA_HOME%\bin;以分號與前面的路徑隔開.最後在添加一個變數classpath,設置這個變數值為:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;然後再去解壓Eclipse或者打開Eclipse
『叄』 java中虛擬機該怎麼用
第一,你如果安裝的是jdk1.6.0.02這個安裝包,那麼你看看你的安裝路徑下面應該有兩個文件夾,一個叫jdk1.6.0_22,一個叫jre6。
第二,java虛擬機在後面一個文件夾裡面,也就是在名稱為jre6的文件夾內。
第三,java虛擬機的應用:java虛擬機是用來編譯運行java位元組碼文件的,如果你已經有需要運行的java位元組碼文件,那麼只需要配置這個位元組碼文件的路徑就可以了。下面介紹配置路徑(classpath):
【1】,右鍵點擊我的電腦,點擊屬性,選擇高級,你在裡面可以看到「環境變數」的按鈕,點擊它。
【2】,在打開的界面可以看到兩個列表框,在下面的那個列表框「系統變數」下面,你找「變數」那一列看看有沒有classpath這個欄位,如果有就左鍵選中,點擊編輯,在打開的輸入框的最左邊輸入你的java位元組碼文件的全路徑,最後用分號(英文的分號)結束。如果沒有就新建個classpath,把你的java位元組碼文件的全路徑輸入進去,用分號結束就ok,算是路徑配置成功了。
【3】,最後就是運行你的java位元組碼文件了。
點擊開始,運行,輸入cmd跳轉到命令提示符界面。假如你的java位元組碼文件在E:\javatest下面,名字叫Test.class
那你先輸入「E:」然後回車,然後再輸入「cd javatest」回車,然後輸入「java Test」回車,就可以看到你的java位元組碼文件的運行結果了。
我有一篇PPT啊 那裡有詳細的記載啊 謝謝 才內啊
『肆』 何時觸發啟動java虛擬機 csdn
類從被載入到虛擬機內存開始,到卸載出內存為止,它的整個生命周期包括:載入(Loading)、驗證(Verification)、准備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載(Unloading)7個階段。其中,驗證、准備和解析統稱為連接(Linking)。過程如下圖所示。
『伍』 如何設置linux 來啟動java 虛擬機的相關推薦
Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
1.為什麼要使用Java虛擬機?
Java語言的一個非常重要的特點就是與平台的無關性。而使用Java虛擬機是實現這一特點的關鍵。一般的高級語言如果要在不同的平台上運行, 至少需要編譯成不同的目標代碼。而引入Java語言虛擬機後,Java語言在不同平台上運行時不需要重新編譯.
Java虛擬機屏蔽了與具體平台相關的信息,使得Java語言編譯程序只需生成在Java虛擬機上運行的目標代碼(位元組碼),就可以在多種平台上不加修改地運行。Java虛擬機在執行位元組碼時,把位元組碼解釋成具體平台上的機器指令執行。
2.誰需要了解Java虛擬機
Java虛擬機是Java語言底層實現的基礎,對Java語言感興趣的人都應對Java虛擬機有個大概的了解。這有助於理解Java語言的一些性質,也有助於使用Java語言。
對於要在特定平台上實現Java虛擬機的軟體人員,Java語言的編譯器作者以及要用硬體晶元實現Java虛擬機的人來說,則必須深刻理解Java虛擬機的規范。
另外,如果你想擴展 Java語言,或是把其它語言編譯成Java語言的位元組碼,你也需要深入地了解Java虛擬機。
3.Java虛擬機支持的數據類型
Java虛擬機支持Java語言的基本數據類型如下:
byte://1位元組有符號整數的補碼 short://2位元組有符號整數的補碼 int://4位元組有符號整數的補碼 long://8位元組有符號整數的補碼 float://4位元組IEEE754單精度浮點數 double://8位元組IEEE754雙精度浮點數 char://2位元組無符號Unicode字元
幾乎所有的Java類型檢查都是在編譯時完成的。上面列出的原始數據類型的數據在 Java執行時不需要用硬體標記。操作這些原始數據類型數據的位元組碼(指令)本身就已經指出了操作數的數據類型,例如iadd、ladd、fadd和dadd指令都是把兩個數相加,其操作數類型特別是int、long、float和double。
虛擬機沒有給boolean(布爾)類型設置單獨的指令。boolean型的數據是由integer指令, 包括integer返回來處理的。boolean型的數組則是用byte數組來處理的。
虛擬機使用IEEE754格式的浮點數。不支持IEEE格式的較舊的計算機,在運行Java數值計算程序時,可能會非常慢。
虛擬機支持的其它數據類型包括:
object//對一個Javaobject(對象)的4位元組引用 returnAddress//4位元組,用於jsr/ret/jsr-w/ret-w指令
注:Java數組被當作object處理。
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對 object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向 該object的數據。
用Java虛擬機的位元組碼表示的程序應該遵守類型規定。Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。
Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。
從Java虛擬機支持的數據類型可以看出,Java對數據類型的內部格式進行了嚴格規定,這樣使得各種Java虛擬機的實現對數據的解釋是相同的,從而保證了Java的與平台無關性和可移植性。
『陸』 關於java虛擬機啟動問題。
首先在WINDOWS系統上無法實現你所說的程序1和程序2使用jdk6,程序3和程序4使用jdk7
所以在WINDOWS系統上都是共用一個JAVA虛擬機的。
『柒』 java 虛擬機啟動失敗
是你裝JDK殘留的問題,如果沒猜錯的話,你的機子有其他的高版本的java虛擬機了,雖然你重新裝了JDK,但是,默認是不覆蓋的,你在卸載程序里將其他版本的先刪掉,再裝一個唯一的java虛擬機,這就因該沒有問題了