java虛擬機,java虛擬機版本不滿足遊戲要求

本文目錄一覽:

什麼是Java虛擬機?

虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。

Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM屏蔽了與具體操作系統平台相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平台上不加修改地運行。

這種解釋應該算是正確的,但是只描述了虛擬機的外部行為和功能,並沒有針對內部原理做出說明。一般情況下我們不需要知道虛擬機的運行原理,只要專註寫java代碼就可以了,這也正是虛擬機之所以存在的原因–屏蔽底層操作系統平台的不同並且減少基於原生語言開發的複雜性,使java這門語言能夠跨各種平台(只要虛擬機廠商在特定平台上實現了虛擬機),並且簡單易用。這些都是虛擬機的外部特性,但是從這些信息來解釋虛擬機,未免太籠統了,無法讓我們知道內部原理。

從進程的角度解釋JVM

讓我們嘗試從操作系統的層面來理解虛擬機。我們知道,虛擬機是運行在操作系統之中的,那麼什麼東西才能在操作系統中運行呢?當然是進程,因為進程是操作系統中的執行單位。可以這樣理解,當它在運行的時候,它就是一個操作系統中的進程實例,當它沒有在運行時(作為可執行文件存放於文件系統中),可以把它叫做程序。

對命令行比較熟悉的同學,都知道其實一個命令對應一個可執行的二進制文件,當敲下這個命令並且回車後,就會創建一個進程,加載對應的可執行文件到進程的地址空間中,並且執行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

首先編寫C語言版的HelloWorld程序。

編譯C語言版的HelloWorld程序:

gcc HelloWorld.c -o HelloWorld

運行C語言版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloWorld/src$ ./HelloWorld

hello world

gcc編譯器編譯後的文件直接就是可被操作系統識別的二進制可執行文件,當我們在命令行中敲下 ./HelloWorld這條命令的時候, 直接創建一個進程, 並且將可執行文件加載到進程的地址空間中, 執行文件中的指令。

作為對比, 我們看一下Java版HelloWord程序的編譯和執行形式。

首先編寫源文件HelloWord.java :

編譯Java版的HelloWorld程序:

運行Java版的HelloWorld程序:

zhangjg@linux:/deve/workspace/HelloJava/src$ java -classpath . HelloWorld

HelloWorld

從上面的過程可以看到, 我們在運行Java版的HelloWorld程序的時候, 敲入的命令並不是 ./HelloWorld.class 。 因為class文件並不是可以直接被操作系統識別的二進制可執行文件 。 我們敲入的是java這個命令。 這個命令說明, 我們首先啟動的是一個叫做java的程序, 這個java程序在運行起來之後就是一個JVM進程實例。

上面的命令執行流程是這樣的:

java命令首先啟動虛擬機進程,虛擬機進程成功啟動後,讀取參數“HelloWorld”,把他作為初始類加載到內存,對這個類進行初始化和動態鏈接(關於類的初始化和動態鏈接會在後面的博客中介紹),然後從這個類的main方法開始執行。也就是說我們的.class文件不是直接被系統加載後直接在cpu上執行的,而是被一個叫做虛擬機的進程託管的。首先必須虛擬機進程啟動就緒,然後由虛擬機中的類加載器加載必要的class文件,包括jdk中的基礎類(如String和Object等),然後由虛擬機進程解釋class字節碼指令,把這些字節碼指令翻譯成本機cpu能夠識別的指令,才能在cpu上運行。

從這個層面上來看,在執行一個所謂的java程序的時候,真真正正在執行的是一個叫做Java虛擬機的進程,而不是我們寫的一個個的class文件。這個叫做虛擬機的進程處理一些底層的操作,比如內存的分配和釋放等等。我們編寫的class文件只是虛擬機進程執行時需要的“原料”。這些“原料”在運行時被加載到虛擬機中,被虛擬機解釋執行,以控制虛擬機實現我們java代碼中所定義的一些相對高層的操作,比如創建一個文件等,可以將class文件中的信息看做對虛擬機的控制信息,也就是一種虛擬指令。

編程語言也有自己的原理, 學習一門語言, 主要是把它的原理搞明白。 看似一個簡單的HelloWorld程序, 也有很多深入的內容值得剖析。

JVM體系結構簡介

為了展示虛擬機進程和class文件的關係,特意畫了下面一張圖:

根據上圖表達的內容,我們編譯之後的class文件是作為Java虛擬機的原料被輸入到Java虛擬機的內部的,那麼具體由誰來做這一部分工作呢?其實在Java虛擬機內部,有一個叫做類加載器的子系統,這個子系統用來在運行時根據需要加載類。注意上面一句話中的“根據需要”四個字。在Java虛擬機執行過程中,只有他需要一個類的時候,才會調用類加載器來加載這個類,並不會在開始運行時加載所有的類。就像一個人,只有餓的時候才去吃飯,而不是一次把一年的飯都吃到肚子里。一般來說,虛擬機加載類的時機,在第一次使用一個新的類的時候。本專欄後面的文章會具體討論Java中的類加載器。

由虛擬機加載的類,被加載到Java虛擬機內存中之後,虛擬機會讀取並執行它裡面存在的字節碼指令。虛擬機中執行字節碼指令的部分叫做執行引擎。就像一個人,不是把飯吃下去就完事了,還要進行消化,執行引擎就相當於人的腸胃系統。在執行的過程中還會把各個class文件動態的連接起來。關於執行引擎的具體行為和動態鏈接相關的內容也會在本專欄後續的文章中進行討論。

我們知道,Java虛擬機會進行自動內存管理。具體說來就是自動釋放沒有用的對象,而不需要程序員編寫代碼來釋放分配的內存。這部分工作由垃圾收集子系統負責。

從上面的論述可以知道, 一個Java虛擬機實例在運行過程中有三個子系統來保障它的正常運行,分別是類加載器子系統, 執行引擎子系統和垃圾收集子系統。 如下圖所示:

虛擬機的運行,必須加載class文件,並且執行class文件中的字節碼指令。它做這麼多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。虛擬機也需要空間來存放個中數據。首先,加載的字節碼,需要一個單獨的內存空間來存放;一個線程的執行,也需要內存空間來維護方法的調用關係,存放方法中的數據和中間計算結果;在執行的過程中,無法避免的要創建對象,創建的對象需要一個專門的內存空間來存放。關於虛擬機運行時數據區的內容,也會出現在本專欄後續的文章中。虛擬機的運行時內存區大概可以分成下圖所示的幾個部分。(這裡只是大概劃分,並沒有劃分的很精細)

總結

寫到這裡,基本上關於我對java虛擬機的理解就寫完了。這篇文章的主題雖然是深入理解Java虛擬機,但是你可能感覺一點也不“深入”,也只是泛泛而談。我也有這樣的感覺。限於自己水平有限,也只能這樣了,要是想深入理解java虛擬機,強烈建議讀一下三本書:

《深入Java虛擬機》

《深入理解Java虛擬機JVM高級特性與最佳實踐》

《Java虛擬機規範》

其實我也讀過這幾本書,但是它們對虛擬機的解釋也是基於一個外部模型,而沒有深入剖析虛擬機內部的實現原理。虛擬機是一個大而複雜的東西,實現虛擬機的人都是大牛級別的,如果不是參與過虛擬機的實現,應該很少有人能把它參透。本專欄後面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數, 但是深入講解虛擬機的書, 目前為止我就見過這三本,並且網上的資料也不是很多。

最後做一個總結:

1 虛擬機並不神秘,在操作系統的角度看來,它只是一個普通進程。

2 這個叫做虛擬機的進程比較特殊,它能夠加載我們編寫的class文件。如果把JVM比作一個人,那麼class文件就是我們吃的食物。

3 加載class文件的是一個叫做類加載器的子系統。就好比我們的嘴巴,把食物吃到肚子里。

4 虛擬機中的執行引擎用來執行class文件中的字節碼指令。就好比我們的腸胃,對吃進去的食物進行消化。

5 虛擬機在執行過程中,要分配內存創建對象。當這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內存的任務由垃圾收集器負責。就好比人吃進去的食物,在消化之後,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯並消化食物。

擴展資料:

關於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虛擬機是什麼意思?

Java虛擬機(Java Virtual Machine,簡稱JVM)是一種假想的計算機。從結構上看,它由抽象的指令集、寄存器組、類文件格式規定、堆棧、內存垃圾收集器和存儲區六個部件組成。指令集採用與平合無關的字節碼形式,寄存器組中包含程序計數器、堆棧指針、運行環境指針和變量指針,類文件也與平台無關,堆棧用來傳遞參數和返回運行結果,垃圾收集器收集不再使用的內存片段,存儲區則用來存放字節碼。JVM僅僅規定部件的功能和規格。雖然這些功能和規格是統一的,但是並沒有規定這此部件的具體實現技術,就是說,可以用任何一種技術來實現。

Java中引入了虛擬機的概念,即在機器和編譯程序之間加入了一層抽象的虛擬的機器。這台虛擬的機器在任何平台上都提供給編譯程序一個的共同的接口。編譯程序只需要面向虛擬機,生成虛擬機能夠理解的代碼,然後由解釋器來將虛擬機代碼轉換為特定系統的機器碼執行。在Java中,這種供虛擬機理解的代碼叫做字節碼(ByteCode),它不面向任何特定的處理器,只面向虛擬機。

每一種平台的解釋器是不同的,但是實現的虛擬機是相同的。Java源程序經過編譯器編譯後變成字節碼,字節碼由虛擬機解釋執行,虛擬機將每一條要執行的字節碼送給解釋器,解釋器將其翻譯成特定機器上的機器碼,然後在特定的機器上運行。

可以說,Java虛擬機是Java語言的基礎。它是Java技術的重要組成部分。Java虛擬機是一個抽象的計算機,和實際的計算機一樣,它具有一個指令集並使用不同的存儲區域。它負責執行指令,還要管理數據、內存和寄存器。Java解釋器負責將字節代碼翻譯成特定機器的機器代碼。Java是一種簡單的語言。它用到的概念不多,而且多為程序員所熟悉。如果你是一名程序員,掌握Java對你來說是易如反掌的事。即使你沒有學過任何編程語言,學習Java也要比學習C++要容易的多。

JAVA虛擬機是什麼

Java虛擬機(Java

Virtual

Machine)

簡稱JVM

Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。

 Java虛擬機(JVM)一種用於計算設備的規範,可用不同的方式(軟件或硬件)加以實現。編譯虛擬機的指令集與編譯微處理器的指令集非常類似。Java虛擬機包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。Java虛擬機(JVM)是可運行Java代碼的假想計算機。只要根據JVM規格描述將解釋器移植到特定的計算機上,就能保證經過編譯的任何Java代碼能夠在該系統上運行。Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。

什麼是 Java 虛擬機?

1.

java虛擬機定義: 虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java虛擬機屏蔽了與…

2.

java虛擬機的基本結構

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/188929.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-29 07:51
下一篇 2024-11-29 07:51

相關推薦

  • Git secbit:一種新型的安全Git版本

    Git secbit是一種新型的安全Git版本,它在保持Git原有功能的同時,針對Git存在的安全漏洞做出了很大的改進。下面我們將從多個方面對Git secbit做詳細地闡述。 一…

    編程 2025-04-29
  • 為什麼不用Python開發遊戲

    Python是一種高級編程語言,擁有簡單易學、代碼簡潔等優點。同時,Python也是一種多用途的語言,可以用於Web開發、數據分析以及機器學習等領域。然而,對於遊戲開發領域,Pyt…

    編程 2025-04-29
  • 使用Python製作遊戲代碼

    Python是一種高級編程語言,因其簡潔明了的代碼風格、易於學習和使用而備受青睞。Python已經成為遊戲製作的熱門選擇之一,可以通過Pygame、Panda3D等工具來實現遊戲制…

    編程 2025-04-29
  • 如何將Java項目分成Modules並使用Git進行版本控制

    本文將向您展示如何將Java項目分成模塊,並使用Git對它們進行版本控制。分割Java項目可以使其更容易維護和拓展。Git版本控制還可以讓您跟蹤項目的發展並協作開發。 一、為什麼要…

    編程 2025-04-28
  • Python的版本演變

    Python是一門非常流行的編程語言,它有着簡潔、易讀、易寫的特點。自1991年由Guido van Rossum發明以來,Python已經發展成為一個成熟的編程語言,擁有多個版本…

    編程 2025-04-28
  • Python貪吃蛇遊戲設計報告

    本文將從遊戲設計的目標、實現思路、技術要點、代碼實現等多個方面對Python貪吃蛇遊戲進行詳細闡述。 一、遊戲設計的目標 貪吃蛇是一款經典的遊戲,我們的遊戲設計不僅要實現基本的玩法…

    編程 2025-04-28
  • librosa版本用法介紹

    librosa是一個用於音頻信號處理的python庫,具有多種處理音頻的功能。在librosa庫中,版本號非常重要,在不同的版本中可能會存在一些差異。本文將圍繞librosa的版本…

    編程 2025-04-28
  • 用Python編寫推箱子遊戲並上傳至百度網盤

    本文將詳細闡述如何使用Python編寫一個推箱子遊戲,並將代碼上傳至百度網盤,以便大家學習和使用。 一、遊戲介紹 推箱子遊戲是一種非常經典的益智類遊戲,遊戲中,玩家需要將箱子推到指…

    編程 2025-04-28
  • Python做的遊戲可以導出嗎

    Python是一種高級編程語言,最初用於解決系統管理員的日常任務,具有易學、易用、高效的特點,因此在遊戲開發中也逐漸受到了廣泛的關注。那麼,Python做的遊戲可以導出嗎?答案是肯…

    編程 2025-04-27
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27

發表回復

登錄後才能評論