真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java虛擬機(jī)體系結(jié)構(gòu)

1 概述
眾所周知,Java支持平臺(tái)無(wú)關(guān)性、安全性和網(wǎng)絡(luò)移動(dòng)性。而Java平臺(tái)由Java虛擬機(jī)和Java核心類(lèi)所構(gòu)成,它為純Java程序提供了統(tǒng)一的編程接口,而不管下層操作系統(tǒng)是什么。正是得益于Java虛擬機(jī),它號(hào)稱(chēng)的“一次編譯,到處運(yùn)行”才能有所保障。

我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、和田縣ssl等。為上1000+企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的和田縣網(wǎng)站制作公司

1.1 Java程序執(zhí)行流程
Java程序的執(zhí)行依賴(lài)于編譯環(huán)境和運(yùn)行環(huán)境。源碼代碼轉(zhuǎn)變成可執(zhí)行的機(jī)器代碼,由下面的流程完成:

Java虛擬機(jī)體系結(jié)構(gòu)

Java技術(shù)的核心就是Java虛擬機(jī),因?yàn)樗械腏ava程序都在虛擬機(jī)上運(yùn)行。Java程序的運(yùn)行需要Java虛擬機(jī)、Java API和Java Class文件的配合。Java虛擬機(jī)實(shí)例負(fù)責(zé)運(yùn)行一個(gè)Java程序。當(dāng)啟動(dòng)一個(gè)Java程序時(shí),一個(gè)虛擬機(jī)實(shí)例就誕生了。當(dāng)程序結(jié)束,這個(gè)虛擬機(jī)實(shí)例也就消亡。

Java虛擬機(jī)體系結(jié)構(gòu)

Java的跨平臺(tái)特性,因?yàn)樗嗅槍?duì)不同平臺(tái)的虛擬機(jī)。

1.2 Java虛擬機(jī)
Java虛擬機(jī)的主要任務(wù)是裝載class文件并且執(zhí)行其中的字節(jié)碼。由下圖可以看出,Java虛擬機(jī)包含一個(gè)類(lèi)裝載器(class loader),它可以從程序和API中裝載class文件,Java API中只有程序執(zhí)行時(shí)需要的類(lèi)才會(huì)被裝載,字節(jié)碼由執(zhí)行引擎來(lái)執(zhí)行。

Java虛擬機(jī)體系結(jié)構(gòu)

當(dāng)Java虛擬機(jī)由主機(jī)操作系統(tǒng)上的軟件實(shí)現(xiàn)時(shí),Java程序通過(guò)調(diào)用本地方法和主機(jī)進(jìn)行交互。Java方法由Java語(yǔ)言編寫(xiě),編譯成字節(jié)碼,存儲(chǔ)在class文件中。本地方法由C/C++/匯編語(yǔ)言編寫(xiě),編譯成和處理器相關(guān)的機(jī)器代碼,存儲(chǔ)在動(dòng)態(tài)鏈接庫(kù)中,格式是各個(gè)平臺(tái)專(zhuān)有。所以本地方法是聯(lián)系Java程序和底層主機(jī)操作系統(tǒng)的連接方式。

由于Java虛擬機(jī)并不知道某個(gè)class文件是如何被創(chuàng)建的,是否被篡改一無(wú)所知,所以它實(shí)現(xiàn)了一個(gè)class文件檢測(cè)器,確保class文件中定義的類(lèi)型可以安全地使用。class文件檢驗(yàn)器通過(guò)四趟獨(dú)立的掃描來(lái)保證程序的健壯性:

class文件的結(jié)構(gòu)檢查
類(lèi)型數(shù)據(jù)的語(yǔ)義檢查
字節(jié)碼驗(yàn)證
符號(hào)引用驗(yàn)證
Java虛擬機(jī)在執(zhí)行字節(jié)碼時(shí)還進(jìn)行其它的一些內(nèi)置的安全機(jī)制的操作,他們作為Java編程語(yǔ)言保證Java程序健壯性的特性,同時(shí)也是Java虛擬機(jī)的特性:

類(lèi)型安全的引用轉(zhuǎn)換
結(jié)構(gòu)化的內(nèi)存訪問(wèn)
自動(dòng)垃圾收集
數(shù)組邊界檢查
空引用檢查
1.3 Java虛擬機(jī)數(shù)據(jù)類(lèi)型
Java虛擬機(jī)通過(guò)某些數(shù)據(jù)類(lèi)型來(lái)執(zhí)行計(jì)算。數(shù)據(jù)類(lèi)型可以分為兩種:基本類(lèi)型和引用類(lèi)型,如下圖:

Java虛擬機(jī)體系結(jié)構(gòu)

但boolean有點(diǎn)特別,當(dāng)編譯器把Java源碼編譯為字節(jié)碼時(shí),它會(huì)用int或byte表示boolean。在Java虛擬機(jī)中,false是由0表示,而true則由所有非零整數(shù)表示。和Java語(yǔ)言一樣,Java虛擬機(jī)的基本類(lèi)型的值域在任何地方都是一致的,不管主機(jī)平臺(tái)是什么,一個(gè)long在任何虛擬機(jī)中總是一個(gè)64位二進(jìn)制補(bǔ)碼的有符號(hào)整數(shù)。

對(duì)于returnAddress,這個(gè)基本類(lèi)型被用來(lái)實(shí)現(xiàn)Java程序中的finally子句,Java程序員不能使用這個(gè)類(lèi)型,它的值指向一條虛擬機(jī)指令的操作碼。

2 體系結(jié)構(gòu)
在 Java虛擬機(jī)規(guī)范中,一個(gè)虛擬機(jī)實(shí)例的行為是分別按照子系統(tǒng)、內(nèi)存區(qū)、數(shù)據(jù)類(lèi)型和指令來(lái)描述的,這些組成部分一起展示了抽象的虛擬機(jī)的內(nèi)部體系結(jié)構(gòu)。

Java虛擬機(jī)體系結(jié)構(gòu)
2.1 class文件
Java class文件包含了關(guān)于類(lèi)或接口的所有信息。class文件的“基本類(lèi)型”如下:

u1 1個(gè)字節(jié),無(wú)符號(hào)類(lèi)型
u2 2個(gè)字節(jié),無(wú)符號(hào)類(lèi)型
u4 4個(gè)字節(jié),無(wú)符號(hào)類(lèi)型
u8 8個(gè)字節(jié),無(wú)符號(hào)類(lèi)型

如果想了解更多,Oracle的JVM SE7給出了官方規(guī)范:The Java? Virtual Machine Specification

class文件包含的內(nèi)容:

ClassFile {

u4 magic; //魔數(shù):0xCAFEBABE,用來(lái)判斷是否是Java class文件
u2 minor_version; //次版本號(hào)
u2 major_version; //主版本號(hào)
u2 constant_pool_count; //常量池大小
cp_info constant_pool[constant_pool_count-1]; //常量池
u2 access_flags; //類(lèi)和接口層次的訪問(wèn)標(biāo)志(通過(guò)|運(yùn)算得到)
u2 this_class; //類(lèi)索引(指向常量池中的類(lèi)常量)
u2 super_class; //父類(lèi)索引(指向常量池中的類(lèi)常量)
u2 interfaces_count; //接口索引計(jì)數(shù)器
u2 interfaces[interfaces_count]; //接口索引集合
u2 fields_count; //字段數(shù)量計(jì)數(shù)器
field_info fields[fields_count]; //字段表集合
u2 methods_count; //方法數(shù)量計(jì)數(shù)器
method_info methods[methods_count]; //方法表集合
u2 attributes_count; //屬性個(gè)數(shù)
attribute_info attributes[attributes_count]; //屬性表

}
2.2 類(lèi)裝載器子系統(tǒng)
類(lèi)裝載器子系統(tǒng)負(fù)責(zé)查找并裝載類(lèi)型信息。其實(shí)Java虛擬機(jī)有兩種類(lèi)裝載器:系統(tǒng)裝載器和用戶自定義裝載器。前者是Java虛擬機(jī)實(shí)現(xiàn)的一部分,后者則是Java程序的一部分。

Java虛擬機(jī)體系結(jié)構(gòu)

啟動(dòng)類(lèi)裝載器(bootstrap class loader):它用來(lái)加載 Java 的核心庫(kù),是用原生代碼來(lái)實(shí)現(xiàn)的,并不繼承自java.lang.ClassLoader。
擴(kuò)展類(lèi)裝載器(extensions class loader):它用來(lái)加載 Java 的擴(kuò)展庫(kù)。Java 虛擬機(jī)的實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫(kù)目錄。該類(lèi)加載器在此目錄里面查找并加載 Java 類(lèi)。
應(yīng)用程序類(lèi)裝載器(application class loader):它根據(jù) Java 應(yīng)用的類(lèi)路徑(CLASSPATH)來(lái)加載 Java 類(lèi)。一般來(lái)說(shuō),Java 應(yīng)用的類(lèi)都是由它來(lái)完成加載的??梢酝ㄟ^(guò) ClassLoader.getSystemClassLoader()來(lái)獲取它。
除了系統(tǒng)提供的類(lèi)裝載器以外,開(kāi)發(fā)人員可以通過(guò)繼承 java.lang.ClassLoader類(lèi)的方式實(shí)現(xiàn)自己的類(lèi)裝載器,以滿足一些特殊的需求。

類(lèi)裝載器子系統(tǒng)涉及Java虛擬機(jī)的其它幾個(gè)組成部分以及來(lái)自java.lang庫(kù)的類(lèi)。ClassLoader定義的方法為程序提供了訪問(wèn)類(lèi)裝載器機(jī)制的接口。此外,對(duì)于每一個(gè)被裝載的類(lèi)型,Java虛擬機(jī)都會(huì)為它創(chuàng)建一個(gè)java.lang.Class類(lèi)的實(shí)例來(lái)代表該類(lèi)型。和其它對(duì)象一樣,用戶自定義的類(lèi)裝載器以及Class類(lèi)的實(shí)例放在內(nèi)存中的堆區(qū),而裝載的類(lèi)型信息則位于方法區(qū)。

類(lèi)裝載器子系統(tǒng)除了要定位和導(dǎo)入二進(jìn)制class文件外,還必須負(fù)責(zé)驗(yàn)證被導(dǎo)入類(lèi)的正確性,為類(lèi)變量分配并初始化內(nèi)存,以及解析符號(hào)引用。這些動(dòng)作還需要按照以下順序進(jìn)行:

裝載(查找并裝載類(lèi)型的二進(jìn)制數(shù)據(jù))
連接(執(zhí)行驗(yàn)證:確保被導(dǎo)入類(lèi)型的正確性;準(zhǔn)備:為類(lèi)變量分配內(nèi)存,并將其初始化為默認(rèn)值;解析:把類(lèi)型中的符號(hào)引用轉(zhuǎn)換為直接引用)
初始化(類(lèi)變量初始化為正確初始值)
2.3 方法區(qū)
在Java虛擬機(jī)中,關(guān)于被裝載的類(lèi)型信息存儲(chǔ)在一個(gè)方法區(qū)的內(nèi)存中。當(dāng)虛擬機(jī)裝載某個(gè)類(lèi)型時(shí),它使用類(lèi)裝載器定位相應(yīng)的class文件,然后讀入這個(gè)class文件并將它傳輸?shù)教摂M機(jī)中,接著虛擬機(jī)提取其中的類(lèi)型信息,并將這些信息存儲(chǔ)到方法區(qū)。方法區(qū)也可以被垃圾回收器收集,因?yàn)樘摂M機(jī)允許通過(guò)用戶定義的類(lèi)裝載器來(lái)動(dòng)態(tài)擴(kuò)展Java程序。

方法區(qū)中存放了以下信息:

這個(gè)類(lèi)型的全限定名(如全限定名java.lang.Object)
這個(gè)類(lèi)型的直接超類(lèi)的全限定名
這個(gè)類(lèi)型是類(lèi)類(lèi)型還是接口類(lèi)型
這個(gè)類(lèi)型的訪問(wèn)修飾符(public, abstract, final的某個(gè)子集)
任何直接超接口的全限定名的有序列表
該類(lèi)型的常量池(一個(gè)有序集合,包括直接常量[string, integer和floating point常量]和對(duì)其它類(lèi)型、字段和方法的符號(hào)引用)
字段信息(字段名、類(lèi)型、修飾符)
方法信息(方法名、返回類(lèi)型、參數(shù)數(shù)量和類(lèi)型、修飾符)
除了常量以外的所有類(lèi)(靜態(tài))變量
指向ClassLoader類(lèi)的引用(每個(gè)類(lèi)型被裝載時(shí),虛擬機(jī)必須跟蹤它是由啟動(dòng)類(lèi)裝載器還是由用戶自定義類(lèi)裝載器裝載的)
指向Class類(lèi)的引用(對(duì)于每一個(gè)被裝載的類(lèi)型,虛擬機(jī)相應(yīng)地為它創(chuàng)建一個(gè)java.lang.Class類(lèi)的實(shí)例。比如你有一個(gè)到j(luò)ava.lang.Integer類(lèi)的對(duì)象的引用,那么只需要調(diào)用Integer對(duì)象引用的getClass()方法,就可以得到表示java.lang.Integer類(lèi)的Class對(duì)象)
2.4 堆
Java程序在運(yùn)行時(shí)創(chuàng)建的所有類(lèi)實(shí)例或數(shù)組(數(shù)組在Java虛擬機(jī)中是一個(gè)真正的對(duì)象)都放在同一個(gè)堆中。由于Java虛擬機(jī)實(shí)例只有一個(gè)堆空間,所以所有線程都將共享這個(gè)堆。需要注意的是,Java虛擬機(jī)有一條在堆中分配對(duì)象的指令,卻沒(méi)有釋放內(nèi)存的指令,因?yàn)樘摂M機(jī)把這個(gè)任務(wù)交給垃圾收集器處理。Java虛擬機(jī)規(guī)范并沒(méi)有強(qiáng)制規(guī)定垃圾收集器,它只要求虛擬機(jī)實(shí)現(xiàn)必須“以某種方式”管理自己的堆空間。比如某個(gè)實(shí)現(xiàn)可能只有固定大小的堆空間,當(dāng)空間填滿,它就簡(jiǎn)單拋出OutOfMemory異常,根本不考慮回收垃圾對(duì)象的問(wèn)題,但卻是符合規(guī)范的。

Java虛擬機(jī)規(guī)范并沒(méi)有規(guī)定Java對(duì)象在堆中如何表示,這給虛擬機(jī)的實(shí)現(xiàn)者決定怎么設(shè)計(jì)。一個(gè)可能的堆設(shè)計(jì)如下:Java虛擬機(jī)體系結(jié)構(gòu)

一個(gè)句柄池,一個(gè)對(duì)象池。一個(gè)對(duì)象的引用就是一個(gè)指向句柄池的本地指針。這種設(shè)計(jì)的好處有利于堆碎片的整理,當(dāng)移動(dòng)對(duì)象池中的對(duì)象時(shí),句柄部分只需更改一下指針指向?qū)ο蟮男碌刂芳纯伞H秉c(diǎn)是每次訪問(wèn)對(duì)象的實(shí)例變量都要經(jīng)過(guò)兩次指針傳遞。

2.5 Java棧
每當(dāng)啟動(dòng)給一個(gè)線程時(shí),Java虛擬機(jī)會(huì)為它分配一個(gè)Java棧。Java棧由許多棧幀組成,一個(gè)棧幀包含一個(gè)Java方法調(diào)用的狀態(tài)。當(dāng)線程調(diào)用一個(gè)Java方法時(shí),虛擬機(jī)壓入一個(gè)新的棧幀到該線程的Java棧中,當(dāng)該方法返回時(shí),這個(gè)棧幀就從Java棧中彈出。Java棧存儲(chǔ)線程中Java方法調(diào)用的狀態(tài)--包括局部變量、參數(shù)、返回值以及運(yùn)算的中間結(jié)果等。Java虛擬機(jī)沒(méi)有寄存器,其指令集使用Java棧來(lái)存儲(chǔ)中間數(shù)據(jù)。這樣設(shè)計(jì)的原因是為了保持Java虛擬機(jī)的指令集盡量緊湊,同時(shí)也便于Java虛擬機(jī)在只有很少通用寄存器的平臺(tái)上實(shí)現(xiàn)。另外,基于棧的體系結(jié)構(gòu),也有助于運(yùn)行時(shí)某些虛擬機(jī)實(shí)現(xiàn)的動(dòng)態(tài)編譯器和即時(shí)編譯器的代碼優(yōu)化。

2.5.1 棧幀

棧幀由局部變量區(qū)、操作數(shù)棧和幀數(shù)據(jù)區(qū)組成。當(dāng)虛擬機(jī)調(diào)用一個(gè)Java方法時(shí),它從對(duì)應(yīng)類(lèi)的類(lèi)型信息中得到此方法的局部變量區(qū)和操作數(shù)棧的大小,并根據(jù)此分配棧幀內(nèi)存,然后壓入Java棧中。

2.5.1.1 局部變量區(qū)

局部變量區(qū)被組織為以字長(zhǎng)為單位、從0開(kāi)始計(jì)數(shù)的數(shù)組。字節(jié)碼指令通過(guò)從0開(kāi)始的索引使用其中的數(shù)據(jù)。類(lèi)型為int, float, reference和returnAddress的值在數(shù)組中占據(jù)一項(xiàng),而類(lèi)型為byte, short和char的值在存入數(shù)組前都被轉(zhuǎn)換為int值,也占據(jù)一項(xiàng)。但類(lèi)型為long和double的值在數(shù)組中卻占據(jù)連續(xù)的兩項(xiàng)。

Java虛擬機(jī)體系結(jié)構(gòu)

2.5.1.2 操作數(shù)棧

和局部變量區(qū)一樣,操作數(shù)棧也是被組織成一個(gè)以字長(zhǎng)為單位的數(shù)組。它通過(guò)標(biāo)準(zhǔn)的棧操作訪問(wèn)--壓棧和出棧。由于程序計(jì)數(shù)器無(wú)法被程序指令直接訪問(wèn),Java虛擬機(jī)的指令是從操作數(shù)棧中取得操作數(shù),所以它的運(yùn)行方式是基于棧而不是基于寄存器。虛擬機(jī)把操作數(shù)棧作為它的工作區(qū),因?yàn)榇蠖鄶?shù)指令都要從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧。

2.5.1.3 幀數(shù)據(jù)區(qū)

除了局部變量區(qū)和操作數(shù)棧,Java棧幀還需要幀數(shù)據(jù)區(qū)來(lái)支持常量池解析、正常方法返回以及異常派發(fā)機(jī)制。每當(dāng)虛擬機(jī)要執(zhí)行某個(gè)需要用到常量池?cái)?shù)據(jù)的指令時(shí),它會(huì)通過(guò)幀數(shù)據(jù)區(qū)中指向常量池的指針來(lái)訪問(wèn)它。除了常量池的解析外,幀數(shù)據(jù)區(qū)還要幫助虛擬機(jī)處理Java方法的正常結(jié)束或異常中止。如果通過(guò)return正常結(jié)束,虛擬機(jī)必須恢復(fù)發(fā)起調(diào)用的方法的棧幀,包括設(shè)置程序計(jì)數(shù)器指向發(fā)起調(diào)用方法的下一個(gè)指令;如果方法有返回值,虛擬機(jī)需要將它壓入到發(fā)起調(diào)用的方法的操作數(shù)棧。為了處理Java方法執(zhí)行期間的異常退出情況,幀數(shù)據(jù)區(qū)還保存一個(gè)對(duì)此方法異常表的引用。

2.6 程序計(jì)數(shù)器
對(duì)于一個(gè)運(yùn)行中的Java程序而言,每一個(gè)線程都有它的程序計(jì)數(shù)器。程序計(jì)數(shù)器也叫PC寄存器。程序計(jì)數(shù)器既能持有一個(gè)本地指針,也能持有一個(gè)returnAddress。當(dāng)線程執(zhí)行某個(gè)Java方法時(shí),程序計(jì)數(shù)器的值總是下一條被執(zhí)行指令的地址。這里的地址可以是一個(gè)本地指針,也可以是方法字節(jié)碼中相對(duì)該方法起始指令的偏移量。如果該線程正在執(zhí)行一個(gè)本地方法,那么此時(shí)程序計(jì)數(shù)器的值是“undefined”。

2.7 本地方法棧
任何本地方法接口都會(huì)使用某種本地方法棧。當(dāng)線程調(diào)用Java方法時(shí),虛擬機(jī)會(huì)創(chuàng)建一個(gè)新的棧幀并壓入Java棧。當(dāng)它調(diào)用的是本地方法時(shí),虛擬機(jī)會(huì)保持Java棧不變,不再在線程的Java棧中壓入新的棧,虛擬機(jī)只是簡(jiǎn)單地動(dòng)態(tài)連接并直接調(diào)用指定的本地方法。

其中方法區(qū)和堆由該虛擬機(jī)實(shí)例中所有線程共享。當(dāng)虛擬機(jī)裝載一個(gè)class文件時(shí),它會(huì)從這個(gè)class文件包含的二進(jìn)制數(shù)據(jù)中解析類(lèi)型信息,然后把這些類(lèi)型信息放到方法區(qū)。當(dāng)程序運(yùn)行時(shí),虛擬機(jī)會(huì)把所有該程序在運(yùn)行時(shí)創(chuàng)建的對(duì)象放到堆中。

像其它運(yùn)行時(shí)內(nèi)存區(qū)一樣,本地方法棧占用的內(nèi)存區(qū)可以根據(jù)需要?jiǎng)討B(tài)擴(kuò)展或收縮。

3 執(zhí)行引擎
在Java虛擬機(jī)規(guī)范中,執(zhí)行引擎的行為使用指令集定義。實(shí)現(xiàn)執(zhí)行引擎的設(shè)計(jì)者將決定如何執(zhí)行字節(jié)碼,實(shí)現(xiàn)可以采取解釋、即時(shí)編譯或直接使用芯片上的指令執(zhí)行,還可以是它們的混合。

執(zhí)行引擎可以理解成一個(gè)抽象的規(guī)范、一個(gè)具體的實(shí)現(xiàn)或一個(gè)正在運(yùn)行的實(shí)例。抽象規(guī)范使用指令集規(guī)定了執(zhí)行引擎的行為。具體實(shí)現(xiàn)可能使用多種不同的技術(shù)--包括軟件方面、硬件方面或樹(shù)種技術(shù)的結(jié)合。作為運(yùn)行時(shí)實(shí)例的執(zhí)行引擎就是一個(gè)線程。

運(yùn)行中Java程序的每一個(gè)線程都是一個(gè)獨(dú)立的虛擬機(jī)執(zhí)行引擎的實(shí)例。從線程生命周期的開(kāi)始到結(jié)束,它要么在執(zhí)行字節(jié)碼,要么執(zhí)行本地方法。

3.1 指令集

方法的字節(jié)碼流由Java虛擬機(jī)的指令序列構(gòu)成。每一條指令包含一個(gè)單字節(jié)的操作碼,后面跟隨0個(gè)或多個(gè)操作數(shù)。操作碼表示需要執(zhí)行的操作;操作數(shù)向Java虛擬機(jī)提供執(zhí)行操作碼需要的額外信息。當(dāng)虛擬機(jī)執(zhí)行一條指令時(shí),可能使用當(dāng)前常量池中的項(xiàng)、當(dāng)前幀的局部變量中的值或者位于當(dāng)前幀操作數(shù)棧頂端的值。

抽象的執(zhí)行引擎每次執(zhí)行一條字節(jié)碼指令。Java虛擬機(jī)中運(yùn)行的程序的每個(gè)線程(執(zhí)行引擎實(shí)例)都執(zhí)行這個(gè)操作。執(zhí)行引擎取得操作碼,如果操作碼有操作數(shù),就取得它的操作數(shù)。它執(zhí)行操作碼和跟隨的操作數(shù)規(guī)定的動(dòng)作,然后再取得下一個(gè)操作碼。這個(gè)執(zhí)行字節(jié)碼的過(guò)程在線程完成前將一直持續(xù),通過(guò)從它的初始方法返回,或者沒(méi)有捕獲拋出的異常都可以標(biāo)志著線程的完成。

4 本地方法接口
Java本地接口,也叫JNI(Java Native Interface),是為可移植性準(zhǔn)備的。本地方法接口允許本地方法完成以下工作:

傳遞或返回?cái)?shù)據(jù)
操作實(shí)例變量
操作類(lèi)變量或調(diào)用類(lèi)方法
操作數(shù)組
對(duì)堆的對(duì)象加鎖
裝載新的類(lèi)
拋出異常
捕獲本地方法調(diào)用Java方法拋出的異常
捕獲虛擬機(jī)拋出的異步異常
指示垃圾收集器某個(gè)對(duì)象不再需要


標(biāo)題名稱(chēng):Java虛擬機(jī)體系結(jié)構(gòu)
標(biāo)題路徑:http://weahome.cn/article/pccpjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部