欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

java虛擬程序代碼,虛擬類java

怎么用記事本編譯運(yùn)行java程序代碼?

在DOS 窗口下。進(jìn)入你寫的程序目錄。例如你把寫的程序保存到D:\\a.java\x0d\x0a\x0d\x0a這個時候在DOS下進(jìn)入D:\\\x0d\x0a\x0d\x0a然后調(diào)用JDK的編譯器javac程序\x0d\x0a\x0d\x0aD:\\javac a.java\x0d\x0a\x0d\x0a如果成功,在同一目錄下會產(chǎn)生一個擴(kuò)展名為.class的字節(jié)碼,然后調(diào)用JDK的java程序是用來啟動虛擬機(jī)\x0d\x0a\x0d\x0aD:\\java a\x0d\x0a\x0d\x0a如果,沒有編寫上的錯誤,就可以看到運(yùn)行結(jié)果了。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請域名、虛擬空間、營銷軟件、網(wǎng)站建設(shè)、韶關(guān)網(wǎng)站維護(hù)、網(wǎng)站推廣。

什么是Java虛擬機(jī)?

虛擬機(jī)是一種抽象化的計算機(jī),通過在實(shí)際的計算機(jī)上仿真模擬各種計算機(jī)功能來實(shí)現(xiàn)的。

Java虛擬機(jī)有自己完善的硬體架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng)。JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使得Java程序只需生成在Java虛擬機(jī)上運(yùn)行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運(yùn)行。

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

從進(jìn)程的角度解釋JVM

讓我們嘗試從操作系統(tǒng)的層面來理解虛擬機(jī)。我們知道,虛擬機(jī)是運(yùn)行在操作系統(tǒng)之中的,那么什么東西才能在操作系統(tǒng)中運(yùn)行呢?當(dāng)然是進(jìn)程,因?yàn)檫M(jìn)程是操作系統(tǒng)中的執(zhí)行單位。可以這樣理解,當(dāng)它在運(yùn)行的時候,它就是一個操作系統(tǒng)中的進(jìn)程實(shí)例,當(dāng)它沒有在運(yùn)行時(作為可執(zhí)行文件存放于文件系統(tǒng)中),可以把它叫做程序。

對命令行比較熟悉的同學(xué),都知道其實(shí)一個命令對應(yīng)一個可執(zhí)行的二進(jìn)制文件,當(dāng)敲下這個命令并且回車后,就會創(chuàng)建一個進(jìn)程,加載對應(yīng)的可執(zhí)行文件到進(jìn)程的地址空間中,并且執(zhí)行其中的指令。下面對比C語言和Java語言的HelloWorld程序來說明問題。

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

編譯C語言版的HelloWorld程序:

gcc HelloWorld.c -o HelloWorld

運(yùn)行C語言版的HelloWorld程序:

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

hello world

gcc編譯器編譯后的文件直接就是可被操作系統(tǒng)識別的二進(jìn)制可執(zhí)行文件,當(dāng)我們在命令行中敲下 ./HelloWorld這條命令的時候, 直接創(chuàng)建一個進(jìn)程, 并且將可執(zhí)行文件加載到進(jìn)程的地址空間中, 執(zhí)行文件中的指令。

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

首先編寫源文件HelloWord.java :

編譯Java版的HelloWorld程序:

運(yùn)行Java版的HelloWorld程序:

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

HelloWorld

從上面的過程可以看到, 我們在運(yùn)行Java版的HelloWorld程序的時候, 敲入的命令并不是 ./HelloWorld.class 。 因?yàn)閏lass文件并不是可以直接被操作系統(tǒng)識別的二進(jìn)制可執(zhí)行文件 。 我們敲入的是java這個命令。 這個命令說明, 我們首先啟動的是一個叫做java的程序, 這個java程序在運(yùn)行起來之后就是一個JVM進(jìn)程實(shí)例。

上面的命令執(zhí)行流程是這樣的:

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

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

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

JVM體系結(jié)構(gòu)簡介

為了展示虛擬機(jī)進(jìn)程和class文件的關(guān)系,特意畫了下面一張圖:

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

由虛擬機(jī)加載的類,被加載到Java虛擬機(jī)內(nèi)存中之后,虛擬機(jī)會讀取并執(zhí)行它里面存在的字節(jié)碼指令。虛擬機(jī)中執(zhí)行字節(jié)碼指令的部分叫做執(zhí)行引擎。就像一個人,不是把飯吃下去就完事了,還要進(jìn)行消化,執(zhí)行引擎就相當(dāng)于人的腸胃系統(tǒng)。在執(zhí)行的過程中還會把各個class文件動態(tài)的連接起來。關(guān)于執(zhí)行引擎的具體行為和動態(tài)鏈接相關(guān)的內(nèi)容也會在本專欄后續(xù)的文章中進(jìn)行討論。

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

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

虛擬機(jī)的運(yùn)行,必須加載class文件,并且執(zhí)行class文件中的字節(jié)碼指令。它做這么多事情,必須需要自己的空間。就像人吃下去的東西首先要放在胃中。虛擬機(jī)也需要空間來存放個中數(shù)據(jù)。首先,加載的字節(jié)碼,需要一個單獨(dú)的內(nèi)存空間來存放;一個線程的執(zhí)行,也需要內(nèi)存空間來維護(hù)方法的調(diào)用關(guān)系,存放方法中的數(shù)據(jù)和中間計算結(jié)果;在執(zhí)行的過程中,無法避免的要創(chuàng)建對象,創(chuàng)建的對象需要一個專門的內(nèi)存空間來存放。關(guān)于虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的內(nèi)容,也會出現(xiàn)在本專欄后續(xù)的文章中。虛擬機(jī)的運(yùn)行時內(nèi)存區(qū)大概可以分成下圖所示的幾個部分。(這里只是大概劃分,并沒有劃分的很精細(xì))

總結(jié)

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

《深入Java虛擬機(jī)》

《深入理解Java虛擬機(jī)JVM高級特性與最佳實(shí)踐》

《Java虛擬機(jī)規(guī)范》

其實(shí)我也讀過這幾本書,但是它們對虛擬機(jī)的解釋也是基于一個外部模型,而沒有深入剖析虛擬機(jī)內(nèi)部的實(shí)現(xiàn)原理。虛擬機(jī)是一個大而復(fù)雜的東西,實(shí)現(xiàn)虛擬機(jī)的人都是大牛級別的,如果不是參與過虛擬機(jī)的實(shí)現(xiàn),應(yīng)該很少有人能把它參透。本專欄后面的一些文章也參考了這三本書, 雖然講解Java語法的書不計其數(shù), 但是深入講解虛擬機(jī)的書, 目前為止我就見過這三本,并且網(wǎng)上的資料也不是很多。

最后做一個總結(jié):

1 虛擬機(jī)并不神秘,在操作系統(tǒng)的角度看來,它只是一個普通進(jìn)程。

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

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

4 虛擬機(jī)中的執(zhí)行引擎用來執(zhí)行class文件中的字節(jié)碼指令。就好比我們的腸胃,對吃進(jìn)去的食物進(jìn)行消化。

5 虛擬機(jī)在執(zhí)行過程中,要分配內(nèi)存創(chuàng)建對象。當(dāng)這些對象過時無用了,必須要自動清理這些無用的對象。清理對象回收內(nèi)存的任務(wù)由垃圾收集器負(fù)責(zé)。就好比人吃進(jìn)去的食物,在消化之后,必須把廢物排出體外,騰出空間可以在下次餓的時候吃飯并消化食物。

擴(kuò)展資料:

關(guān)于JAVA虛擬機(jī)的參數(shù)說明如下:

1、運(yùn)行class文件

執(zhí)行帶main方法的class文件,Java虛擬機(jī)[3]?命令參數(shù)行為:

java CLASS文件名

注意:CLASS文件名不要帶文件后綴.class

例如:

java Test

如果執(zhí)行的class文件是帶包的,即在類文件中使用了:

package ;包名

那應(yīng)該在包的基路徑下執(zhí)行,Java虛擬機(jī)命令行參數(shù):

java ;包名.CLASS文件名

例如:

PackageTest.java中,其包名為:com.ee2ee.test,對應(yīng)的語句為:

package com.ee2ee.test;

PackageTest.java及編譯后的class文件PackageTest.class的存放目錄如下:

classes

|__com

|__ee2ee

|__test

|__PackageTest.java

|__PackageTest.class

要運(yùn)行PackageTest.class,應(yīng)在classes目錄下執(zhí)行:

java com.ee2ee.test.PackageTest

2、運(yùn)行jar文件中的class

原理和運(yùn)行class文件一樣,只需加上參數(shù)-cp jar文件名;即可。

例如:執(zhí)行test.jar中的類com.ee2ee.test.PackageTest,命令行如下:

java -cp test.jar com.ee2ee.test.PackageTest

3、顯示JDK版本信息

當(dāng)一臺機(jī)器上有多個jdk版本時,需要知道當(dāng)前使用的是那個版本的jdk,使用參數(shù)-version即可知道其版本,命令行為:

java -version

4、增加虛擬機(jī)可以使用的最大內(nèi)存

Java虛擬機(jī)可使用的最大內(nèi)存是有限制的,缺省值通常為64MB或128MB。

如果一個應(yīng)用程序?yàn)榱颂岣咝阅芏褦?shù)據(jù)加載內(nèi)存中而占用較大的內(nèi)存,比如超過了默認(rèn)的最大值128MB,需要加大java虛擬機(jī)可使用的最大內(nèi)存,否則會出現(xiàn)Out of Memory的異常。啟動java時,需要使用如下兩個參數(shù):

-Xms java虛擬機(jī)初始化時使用的內(nèi)存大小

-Xmx java虛擬機(jī)可以使用的最大內(nèi)存

以上兩個命令行參數(shù)中設(shè)置的size,可以帶單位,例如:256m表示256MB

舉例說明:

java -Xms128m -Xmx256m ...

表示Java虛擬機(jī)初始化時使用的內(nèi)存為128MB,可使用的最大內(nèi)存為256MB。

對于tomcat,可以修改其腳本catalina. sh(Unix平臺)或catalina.bat(Windows平臺),設(shè)置變量JAVA_OPTS即可,例如:

JAVA_OPTS='-Xms128m -Xmx256m'

參考資料:百度百科-java虛擬機(jī)

簡述JAVA程序的編輯編譯和運(yùn)行過程

第一步(編譯): 創(chuàng)建完源文件之后,程序會先被編譯為.class文件。Java編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器就會先編譯這個被依賴的類,然后引用,否則直接引用,這個有點(diǎn)象make。

如果java編譯器在指定目錄下找不到該類所其依賴的類的.class文件或者.java源文件的話,編譯器話報“cant find symbol”的錯誤。

第二步(運(yùn)行):java類運(yùn)行的過程大概可分為兩個過程:1、類的加載 2、類的執(zhí)行。需要說明的是:JVM主要在程序第一次主動使用類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序就所有的類都加載到內(nèi)存中,而是到不得不用的時候才把它加載進(jìn)來,而且只加載一次。

特別說明:java類中所有public和protected的實(shí)例方法都采用動態(tài)綁定機(jī)制,所有私有方法、靜態(tài)方法、構(gòu)造器及初始化方法clinit都是采用靜態(tài)綁定機(jī)制。而使用動態(tài)綁定機(jī)制的時候會用到方法表,靜態(tài)綁定時并不會用到。

擴(kuò)展資料:

Java整個編譯以及運(yùn)行的過程相當(dāng)繁瑣,本文通過一個簡單的程序來簡單的說明整個流程。

Java代碼編譯:是由Java源碼編譯器來完成;

Java字節(jié)碼的執(zhí)行:是由JVM執(zhí)行引擎來完成

Java程序從源文件創(chuàng)建到程序運(yùn)行要經(jīng)過兩大步驟:

1、源文件由編譯器編譯成字節(jié)碼(ByteCode)

2、字節(jié)碼由java虛擬機(jī)解釋運(yùn)行。因?yàn)閖ava程序既要編譯同時也要經(jīng)過JVM的解釋運(yùn)行,所以說Java被稱為半解釋語言( "semi-interpreted" language)。

java編譯器把java程序編譯成虛擬機(jī)可以識別的二進(jìn)制代碼,稱為什么?

由java編譯器把源文件編譯成虛擬機(jī)可以識別的二進(jìn)制代碼稱為字節(jié)碼。

而字節(jié)碼是由java解釋器去解釋執(zhí)行的。

如何用java編寫代碼讓java虛擬機(jī)崩潰

網(wǎng)上有這樣一套編碼,能使java虛擬機(jī)崩潰:

package?jvm;

public?class?Crash?{

public?static?void?main(String[]?args)?{

//Object[]?o?=?{“abc”};初始值賦值,不會有影響。

Object[]?o?=?null;

while?(true)?{

o?=?new?Object[]?{?o?};

//輸出的話,jvm就不會崩潰。

//System.out.println(o);

}????????

}

}

程序運(yùn)行十幾秒之后,控制臺會出現(xiàn)這樣的錯誤:

Exception?in?thread?"main"?java.lang.OutOfMemoryError:?Java?heap?space

at?jvm.Crash.main(Crash.java:10)

很明顯,超出內(nèi)存空間錯誤。

我將原程序隨意改了一下,如賦初始值等,對程序無影響。

可是我將死循環(huán)中的o輸出在控制臺的時候,jvm居然一直都不崩,為什么輸出的話,就不會超出內(nèi)存空間呢?

我看來,原程序能夠使Jvm崩潰,是因?yàn)樗姥h(huán)中,通過舊對象,不斷創(chuàng)建出新的對象,即創(chuàng)造的對象是互相引用的,所以GC是不會回收它們的,造成堆棧溢出。

仿照這個例子,我寫了一個簡單的類,模仿例子程序中的數(shù)組,如下:

package?jvm;

public?class?MyCrash?{

public?static?void?main(String[]?args)?{

JvmBean?j?=?null;

while(true){

j?=?new?JvmBean(j);

//無論輸出不輸出,jvm都會崩潰

//System.out.println(j);

}

}

}

結(jié)果便是控制臺輸出如下的錯誤:

Exception?in?thread?"main"?java.lang.StackOverflowError

at?jvm.JvmBean.init(JvmBean.java:5)

at?jvm.JvmBean.init(JvmBean.java:5)

at?jvm.JvmBean.init(JvmBean.java:5)

at?jvm.JvmBean.init(JvmBean.java:5)

at?jvm.JvmBean.init(JvmBean.java:5)

一長串的"at jvm.JvmBean.init(JvmBean.java:5)",后面的被省略了。

結(jié)果看來,同樣也造成了jvm崩潰,可是錯誤類型跟例子程序的不同,說堆棧溢出錯誤,并且無論是否輸出,錯誤都一樣發(fā)生,為什么呢?

結(jié)論

第一個異常

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space?at jvm.Crash.main(Crash.java:10)是因?yàn)槌绦驘o法申請到足夠的內(nèi)存的時候拋出的異常,Object數(shù)組o不斷指向新的Object數(shù)組,數(shù)組元素是原來的Object數(shù)組,這使得Object維數(shù)越來越高。不斷申請內(nèi)存空間,最終導(dǎo)致超出jvm中堆的最大值。堆內(nèi)存溢出。為什么輸出打印,時間會延長呢?!輸出打印的話,虛擬機(jī)并不是不會崩潰,而是崩潰的時間大大延長了。而崩潰時間延長其實(shí)是假象,是因?yàn)檩敵鰧儆贗O事件,每次輸出CPU都被中斷,IO很耗時,所以,感覺上才會時間延長。

第二個異常

”類內(nèi)部的靜態(tài)屬性 靜態(tài)塊 對象屬性 構(gòu)造方法。注意這一點(diǎn),那就是說?bean屬性會先于JvmBean的構(gòu)造函數(shù)被初始化。在main函數(shù)中,new一個?JvmBean的構(gòu)造函數(shù)之前,類內(nèi)部的JvmBean對象要優(yōu)先被初始化,這個類內(nèi)部的屬性bean的內(nèi)部同樣也包含了一個JvmBean對象需要被初始化,成循環(huán)調(diào)用,造?成了棧溢出。”所以異常才會是這個——Exception in thread "main" java.lang.StackOverflowError

怎樣把一個java源代碼做成一個軟件成品?

1.其實(shí)就是用一個外部程序 調(diào)用java虛擬機(jī)運(yùn)行你的java程序。

2.可以做一個批處理文件,在里面調(diào)用java 虛擬機(jī)運(yùn)行你的java程序。

3.也可以用某種編程語言,像vb ,c 或c++編個程序,生成exe,能調(diào)用java虛擬機(jī)運(yùn)行你的程序,很簡單的。

【源代碼】

源代碼(也稱源程序),是指一系列人類可讀的計算機(jī)語言指令。 在現(xiàn)代程序語言中,源代碼可以是以書籍或者磁帶的形式出現(xiàn),但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機(jī)程序。

延展閱讀;

Java是一門面向?qū)ο缶幊陶Z言,不僅吸收了C++語言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強(qiáng)大和簡單易用兩個特征。Java語言作為靜態(tài)面向?qū)ο缶幊陶Z言的代表,極好地實(shí)現(xiàn)了面向?qū)ο罄碚摚试S程序員以優(yōu)雅的思維方式進(jìn)行復(fù)雜的編程。

本文題目:java虛擬程序代碼,虛擬類java
本文URL:http://chinadenli.net/article46/dsgioeg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營銷型網(wǎng)站建設(shè)網(wǎng)站制作移動網(wǎng)站建設(shè)搜索引擎優(yōu)化網(wǎng)站內(nèi)鏈外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作