『壹』 什麼是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)32位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'
『貳』 虛擬機是什麼
虛擬機指通過軟體模擬的具有完整硬體系統功能的、運行在一個完全隔離環境中的完整計算機系統。
虛擬系統通過生成現有操作系統的全新虛擬鏡像,它具有真實windows系統完全一樣的功能,進入虛擬系統後,所有操作都是在這個全新的獨立的虛擬系統裡面進行,可以獨立安裝運行軟體。
保存數據,擁有自己的獨立桌面,不會對真正的系統產生任何影響 ,而且具有能夠在現有系統與虛擬鏡像之間靈活切換的一類操作系統。
(2)32位java虛擬機擴展閱讀:
虛擬機的用處:
1、演示環境,可以安裝各種演示環境,便於做各種例子。
2、保證主機的快速運行,減少不必要的垃圾安裝程序,偶爾使用的程序,或者測試用的程序在虛擬機上運行。
3、避免每次重新安裝,銀行等常用工具,不經常使用,而且要求保密比較好的,單獨在一個環境下面運行。
4、想測試一下不熟悉的應用,在虛擬機中隨便安裝和徹底刪除。
5、體驗不同版本的操作系統,如Linux、Mac等。
『叄』 java虛擬機的數據類型
Java虛擬機支持Java語言的基本數據類型有8種,注意String不是基本數據類型如下:
boolean://1位元組有符號整數的補碼
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的與平台無關性和可移植性。
『肆』 安裝UG8.5時缺少32位java虛擬機,電腦沒網怎麼查找java虛擬機的文件夾在哪裡啊,32位
直接搜c盤搜Java
搜不到在命令提示符里(運行里輸入cmd)然後到C盤下,如不是輸入CD..直到C盤下輸入Java -Version回車卡能不能運行不能就是沒裝Java
『伍』 什麼是 Java 虛擬機
您好,提問者:
Java虛擬機簡稱JVM,它的作用如下:
1、其實Java不可跨平台,真正實現跨平台的是JVM虛擬機。
2、JVM其實就是一個編譯java、運行class的一個跟操作系統的一個軟體。
3、JVM的作用只針對於Java,而系統中的東西與它無關。
4、其實說白了就是一個軟體,就像VMware一樣。
Java虛擬機
一、什麼是Java虛擬機
Java虛擬機是一個想像中的機器,在實際的計算機上通過軟體模擬來實現。Java虛擬機有自己想像中的硬體,如處理器、堆棧、寄存器等,還具有相應的指令系統。
為什麼要使用Java虛擬機
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虛擬機體系結構
Java虛擬機由五個部分組成:一組指令集、一組寄存器、一個棧、一個無用單元收集堆(Garbage-collected-heap)、一個方法區域。這五部分是Java虛擬機的邏輯成份,不依賴任何實現技術或組織方式,但它們的功能必須在真實機器上以某種方式實現。
Java指令集
Java虛擬機支持大約248個位元組碼。每個位元組碼執行一種基本的CPU運算,例如,把一個整數加到寄存器,子程序轉移等。Java指令集相當於Java程序的匯編語言。
Java指令集中的指令包含一個單位元組的操作符,用於指定要執行的操作,還有0個或多個操作數,提供操作所需的參數或數據。許多指令沒有操作數,僅由一個單位元組的操作符構成。
虛擬機的內層循環的執行過程如下:
do{
取一個操作符位元組;
根據操作符的值執行一個動作;
}while(程序未結束)
由於指令系統的簡單性,使得虛擬機執行的過程十分簡單,從而有利於提高執行的效率。指令中操作數的數量和大小是由操作符決定的。如果操作數比一個位元組大,那麼它存儲的順序是高位位元組優先。例如,一個16位的參數存放時佔用兩個位元組,其值為:
第一個位元組*256+第二個位元組位元組碼指令流一般只是位元組對齊的。指令tabltch和lookup是例外,在這兩條指令內部要求強制的4位元組邊界對齊。
2.寄存器
Java虛擬機的寄存器用於保存機器的運行狀態,與微處理器中的某些專用寄存器類似。
Java虛擬機的寄存器有四種:
pc:Java程序計數器。
optop:指向操作數棧頂端的指針。
frame:指向當前執行方法的執行環境的指針。
vars:指向當前執行方法的局部變數區第一個變數的指針。
Java虛擬機
Java虛擬機是棧式的,它不定義或使用寄存器來傳遞或接受參數,其目的是為了保證指令集的簡潔性和實現時的高效性(特別是對於寄存器數目不多的處理器)。
所有寄存器都是32位的。
3.棧
Java虛擬機的棧有三個區域:局部變數區、運行環境區、操作數區。
(1)局部變數區 每個Java方法使用一個固定大小的局部變數集。它們按照與vars寄存器的字偏移量來定址。局部變數都是32位的。長整數和雙精度浮點數占據了兩個局部變數的空間,卻按照第一個局部變數的索引來定址。(例如,一個具有索引n的局部變數,如果是一個雙精度浮點數,那麼它實際占據了索引n和n+1所代表的存儲空間。)虛擬機規范並不要求在局部變數中的64位的值是64位對齊的。虛擬機提供了把局部變數中的值裝載到操作數棧的指令,也提供了把操作數棧中的值寫入局部變數的指令。
(2)運行環境區 在運行環境中包含的信息用於動態鏈接,正常的方法返回以及異常傳播。
·動態鏈接
運行環境包括對指向當前類和當前方法的解釋器符號表的指針,用於支持方法代碼的動態鏈接。方法的class文件代碼在引用要調用的方法和要訪問的變數時使用符號。動態鏈接把符號形式的方法調用翻譯成實際方法調用,裝載必要的類以解釋還沒有定義的符號,並把變數訪問翻譯成與這些變數運行時的存儲結構相應的偏移地址。動態鏈接方法和變數使得方法中使用的其它類的變化不會影響到本程序的代碼。
·正常的方法返回
如果當前方法正常地結束了,在執行了一條具有正確類型的返回指令時,調用的方法會得到一個返回值。執行環境在正常返回的情況下用於恢復調用者的寄存器,並把調用者的程序計數器增加一個恰當的數值,以跳過已執行過的方法調用指令,然後在調用者的執行環境中繼續執行下去。
·異常和錯誤傳播
異常情況在Java中被稱作Error(錯誤)或Exception(異常),是Throwable類的子類,在程序中的原因是:①動態鏈接錯,如無法找到所需的class文件。②運行時錯,如對一個空指針的引用
·程序使用了throw語句。
當異常發生時,Java虛擬機採取如下措施:
·檢查與當前方法相聯系的catch子句表。每個catch子句包含其有效指令范圍,能夠處理的異常類型,以及處理異常的代碼塊地址。
·與異常相匹配的catch子句應該符合下面的條件:造成異常的指令在其指令范圍之內,發生的異常類型是其能處理的異常類型的子類型。如果找到了匹配的catch子句,那麼系統轉移到指定的異常處理塊處執行;如果沒有找到異常處理塊,重復尋找匹配的catch子句的過程,直到當前方法的所有嵌套的catch子句都被檢查過。
·由於虛擬機從第一個匹配的catch子句處繼續執行,所以catch子句表中的順序是很重要的。因為Java代碼是結構化的,因此總可以把某個方法的所有的異常處理器都按序排列到一個表中,對任意可能的程序計數器的值,都可以用線性的順序找到合適的異常處理塊,以處理在該程序計數器值下發生的異常情況。
·如果找不到匹配的catch子句,那麼當前方法得到一個"未截獲異常"的結果並返回到當前方法的調用者,好像異常剛剛在其調用者中發生一樣。如果在調用者中仍然沒有找到相應的異常處理塊,那麼這種錯誤傳播將被繼續下去。如果錯誤被傳播到最頂層,那麼系統將調用一個預設的異常處理塊。
(3)操作數棧區 機器指令只從操作數棧中取操作數,對它們進行操作,並把結果返回到棧中。選擇棧結構的原因是:在只有少量寄存器或非通用寄存器的機器(如Intel486)上,也能夠高效地模擬虛擬機的行為。操作數棧是32位的。它用於給方法傳遞參數,並從方法接收結果,也用於支持操作的參數,並保存操作的結果。例如,iadd指令將兩個整數相加。相加的兩個整數應該是操作數棧頂的兩個字。這兩個字是由先前的指令壓進堆棧的。這兩個整數將從堆棧彈出、相加,並把結果壓回到操作數棧中。
每個原始數據類型都有專門的指令對它們進行必須的操作。每個操作數在棧中需要一個存儲位置,除了long和double型,它們需要兩個位置。操作數只能被適用於其類型的操作符所操作。例如,壓入兩個int類型的數,如果把它們當作是一個long類型的數則是非法的。在Sun的虛擬機實現中,這個限制由位元組碼驗證器強制實行。但是,有少數操作(操作符pe和swap),用於對運行時數據區進行操作時是不考慮類型的。
4.無用單元收集堆
Java的堆是一個運行時數據區,類的實例(對象)從中分配空間。Java語言具有無用單元收集能力:它不給程序員顯式釋放對象的能力。Java不規定具體使用的無用單元收集演算法,可以根據系統的需求使用各種各樣的演算法。
5.方法區
方法區與傳統語言中的編譯後代碼或是Unix進程中的正文段類似。它保存方法代碼(編譯後的java代碼)和符號表。在當前的Java實現中,方法代碼不包括在無用單元收集堆中,但計劃在將來的版本中實現。每個類文件包含了一個Java類或一個Java界面的編譯後的代碼。可以說類文件是Java語言的執行代碼文件。為了保證類文件的平台無關性,Java虛擬機規范中對類文件的格式也作了詳細的說明。其具體細節請參考Sun公司的Java虛擬機規范。
『陸』 2019WinServer 能安裝幾台虛擬機
2019WinServer 能安裝幾台虛擬機是根據電腦配置來看的,每裝一台虛擬機就會佔用CPU及內存,如果CPU足夠好,內存足夠大,硬碟空間足夠多,可以無限裝。每台虛擬機相當於一個台式機,可以裝好幾個系統的。
虛擬機指的是在自己當前使用的操作系統基礎上,安裝並利用專門的虛擬機軟體,虛擬出若乾颱計算機,這些虛擬的多台計算機每台有各自的CPU,內存,硬碟,光碟機,軟碟機,網卡,音效卡,鍵盤,滑鼠,串口,並口,USB口等硬體設備。
相關知識:
虛擬機的規范對於object內部的結構沒有任何特殊的要求。在Sun公司的實現中,對object的引用是一個句柄,其中包含一對指針:一個指針指向該object的方法表,另一個指向該object的數據。用Java虛擬機的位元組碼表示的程序應該遵守類型規定。
Java虛擬機的實現應拒絕執行違反了類型規定的位元組碼程序。Java虛擬機由於位元組碼定義的限制似乎只能運行於32位地址空間的機器上。但是可以創建一個Java虛擬機,它自動地把位元組碼轉換成64位的形式。
以上內容參考:網路-虛擬機
『柒』 下載java虛擬機啟動器發現致命異常怎麼回事.
修復Java虛擬機錯誤的解決方案:
1.為Java設置新的系統變數
當Java需要更大的全局最大堆內存大小時,通常會出現Java虛擬機錯誤。通過擴展分配給Java的最大RAM來解決該問題。用戶可以通過建立新的Java System Variable來實現,如下所示。
使用Windows鍵+ R鍵盤快捷鍵打開運行。
在「運行」中輸入「sysdm.cpl」,然後單擊「 確定」以在下面的圖像中打開窗口。
選擇該窗口上的「高級」選項卡。
單擊「 環境變數」按鈕以打開下面的窗口。
單擊「 系統變數」框下的「 新建」按鈕。
在「變數名稱」文本框中輸入「_JAVA_OPTIONS」。
然後在「變數值」文本框中輸入「-Xmx512M」,這會將RAM分配增加到512 MB。
單擊「 確定」按鈕關閉窗口。
然後按環境窗口上的確定按鈕。
2.選擇「以管理員身份運行Java選項」
Java虛擬機錯誤也可能是由於管理員許可權不足造成的。因此,某些用戶可能需要為Java分配管理員許可權。用戶可以在Windows 10中為Java分配管理員許可權,如下所示。
使用Windows鍵+ Q鍵盤快捷鍵打開Cortana。
在搜索框中輸入「Java」。
然後右鍵單擊Java並選擇打開文件位置以在文件資源管理器中打開Java的文件夾。
現在,用戶可以右鍵單擊java.exe並選擇「 屬性」。
選擇兼容性選項卡。
選擇「以管理員身份運行此程序」選項。
選擇「 應用」選項。
單擊「 確定」關閉窗口。
3.重新安裝Java
重新安裝Java也可能會修復某些用戶的Java虛擬機錯誤。首先,在「運行」中輸入「appwiz.cpl」並單擊「 確定 」 ,卸載當前安裝的Java版本。
在搜索框中輸入「Java」。
選擇Java,然後單擊卸載。
在打開的任何確認窗口中單擊是。
此後,重新啟動Windows。
然後在瀏覽器中打開Java下載頁面。
用戶需要32位Java用於32位程序,64位Java用於64位軟體。如果有疑問,最好的辦法是通過單擊Windows Offline和Windows Offline 64位來下載和安裝兩個Java版本。
此後,打開Java安裝向導。
單擊安裝向導上的「 安裝」按鈕。
『捌』 壓縮指針
Java虛擬機中每個Java對象都有一個對象頭,對象頭由標記欄位和類型指針構成。其中標記欄位用以存儲Java虛擬機有關對象的運行數據,如哈希碼、GC信息及鎖信息,而指針類型指向該對象的類。
在64位的虛擬機中,對象頭的標記欄位佔64位,而類型指針又佔64位。也就是說一個對象額外佔用的位元組就是16個位元組。以Integer對象為例,它僅有一個int類型的私有欄位,佔4個位元組。因此,每個Integer的額外開銷至少400%,這也就是Java為什麼要引入基本數據類型的原因之一。為了減少內存開銷,64位Java虛擬機引入了壓縮指針概念(對應虛擬機選項 -XX:+UseCompressedOops,默認開啟),將堆中原本64位的Java對象指針壓縮成32位的。
這樣一來,對象頭的類型指針也會被壓縮成32位,使得對象頭大小從16位元組降低為12位元組。壓縮指針不僅可以作用對象頭的類型指針,還可以作用引用類型的欄位,引用類型的數組。
默認情況下,Java虛擬機中對象的起始地址需要對齊至8的倍數(這個概念我們稱之為內存對齊(對應虛擬機選項 -XX:ObjectAlignmentInBytes,默認值為 8)。如果一個對象用不到8N位元組,那麼空白的那部分空間就白白浪費掉了。這些浪費掉的空間我們稱之為對象之間的填充。默認情況下,Java虛擬機中32位的指針可以定址到2的35次方,也就是32GB的內存空間(超過32位會關閉壓縮指針)。在對壓縮指針解引用時,我們需要將其左移3位,再加上一個固定的偏移量,便可以定址到32GB地址空間偽64位指針了。
此外,我們可以配置剛剛提到的內存對齊選項(-XX:ObjectAlignmentInBytes)來進一步提升內存定址范圍。但是,這也可能增加對象填充,導致壓縮指針沒有打到節省空間效果。
就算關閉了壓縮指針,Java虛擬機也會進行內存對齊。內存對齊不僅在於對象和對象之間,也存在於對象的各個欄位之間。比如說,Java虛擬機中的long欄位、double欄位,以及非壓縮指針狀態下的引用欄位為8的倍數。
內存對齊的一個原因是讓欄位出現在同一CPU的緩存中。如果欄位不對齊,那麼就有可能出現跨緩存行的欄位。也就是說,該欄位的讀取的讀取可能需要跨兩個緩存行,而改欄位的存儲也可能同時污染兩個緩存行。這種情況對程序的執行效率是不利的。
『玖』 starccm安裝找不到java虛擬機
您先看看有沒有安裝相匹配Java。
首先,檢查你是否有安裝與當前NX版本匹配的JAVA版本,如果沒有請安裝。可以在控制面板程序里查看,如果有更新版或者更舊版,可以先卸載再安裝。注意JAVA有32位和64位之分,安裝的時候,不要修改其路徑,直接默認安裝就好了。其次,這個問題可以確認是JAVA沒有與NX軟體正常匹配的原因,大部分電腦,一般只要安裝匹配的JAVA版本就可以了,但是有少部分版本需要額外添加環境變數。第一種方法:環境變數一般有兩個,你可以一個一個添加測試是否有效。變數名:UGII_JAVA_HOME變數值:你的當前JAVA程序所在路徑,比如我的:C:ProgramFilesJavajre1.8.0_172變數名:UGII_JVM_LIBRARY_DIR變數值,和上面的一樣。這樣添加好以後,再進行重新打開NX軟體測試,如果還是不行,請按以下方法。
看警告圖片提示上的修改ugii_env文件來測試,修改這個文件其實和添加環境變數一個意思。不同的NX版本可能修改文件存在差異,一般都是UGII目錄下的ugii_env.dat或者ugii_env_ug.dat文件。這個文件的路徑在(這是我的路徑):C:ProgramFilesSiemensNX12.0UGIIugii_env.dat或者:C:ProgramFilesSiemensNX12.0UGIIugii_env_ug.dat在最後一行,加上你的環境變數以及變數值,例如:UGII_JAVA_HOME=C:ProgramFilesJavajre1.8.0_172一般建議直接添加系統環境變數,省得修改文件弄糊塗了。