Java虛擬機工作原理JVM_第1頁
Java虛擬機工作原理JVM_第2頁
Java虛擬機工作原理JVM_第3頁
Java虛擬機工作原理JVM_第4頁
Java虛擬機工作原理JVM_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、AstheJavaVirtualMachineisastack-basedmachine,almostallofitsinstructionsinvolvetheoperandstackinsomeway.Mostinstructionspushvalues,popvalues,orbothastheyperformtheirfunctions.Java虛擬機是基于棧的(stack-basedmachine)。幾乎所有的java虛擬機的指令,都與操作數棧(operandstack)有關.絕大多數指令都會在執(zhí)行自己功能的時候進行入棧、出棧操作。1Java體系結構介紹Javasiarchitect

2、urearisesoutoffourdistinctbutinterrelatedtechnologies,eachofwhichisdefinedbyaseparatespecificationfromSunMicrosystems:1.1 Java體系結構包括哪幾部分?Java體系結本包括4個獨立但相關的技術theJavaprogramminglanguage程序設計語言theJavaclassfileformat字節(jié)碼文件格式theJavaApplicationProgrammingInterface應用編程接口theJavaVirtualMachine虛擬機1.2 什么是JVMjava

3、虛擬機和javaAPI組成了java運行時。1.3 JVM的主要任務。Java虛擬機的主要任務是裝載class文件并執(zhí)行其中的字節(jié)碼。Java虛擬機包含了一個類裝載器。類裝載器的體系結構二種類裝載器啟動類裝載器用戶定義的類裝載器啟動類裝載器是JVM實現的一部分當被裝載的類引用另外一個類時,JVM就是使用裝載第一個類的類裝載器裝載被引用的類。1.4 為什么java容易被反編譯?因為java程序是動態(tài)連接的。從一個類到另一個類的引用是符號化的。在靜態(tài)連接的可執(zhí)行程序中。類之間的引用只是直接的指針或者偏移量。相反在java的class文件中,指向另一個類的引用通過字符串清楚的標明了所指向的這個類的名

4、字。如果引用是指向一個字段的話。這個字段的名字和描述符(字段的類型)會被詳細說明。如果引用指向一個成員方法,那么這個成員方法的名字和描述符(方法的返回值類型,方法參數的數量和類型)會被詳細說明。包含對自己字段和成員方法的符號引用。包含可選的調試信息。(包括局部變量的名稱和類型)1.5 垃圾回收器缺點:無法確認什么時候開始回收垃圾,無法確認是否已經開始收集,也無法確認要持續(xù)多長時間2平臺無關3安全4網絡移動性5Java虛擬機nativemethodlibrariesruntimedataarcticexecution一,碇加山.engineJ1加)thread1thread2thread3pcr

5、egistersJavastacksLinkVerifyPrepare(oplionally)ResolveInitialize每個JVM都有一個類裝載子系統(tǒng)。運行時數據區(qū):方法區(qū),堆,java棧,pc寄存器,本地方法棧每個JVM實例都有一個方法區(qū)和堆。M們是由該虛擬機中所有線程共享的。每個線程都會得到自己的pc寄存器和java-,pc寄存器的值指示下一條將被執(zhí)行的指令。java棧記錄存儲該線程中java方法調用的狀態(tài)。(包括局部變量,參數,返回值,運算的中間結果。)這些內存區(qū)域是私有的。任何線程都不能訪問另一個線程的pc寄存器和java棧java棧由許多棧幀組成。一個棧幀包含一個java方法

6、的調用的狀態(tài)。當線程調用一個方法的時候,虛擬機壓入一個新的棧楨到該線程的java棧中。當方法返回時,這個棧楨被從java棧中彈出并拋棄。引用有3中,類類型,接口類型,數組類型。JVM中,最基本的數據單元是字。上少選擇32位作為字長。JVM有兩種類裝載器:啟動類裝載器(JVM實現的一部分,每個JVM都必須有一用戶自定義的類裝載器(JAVA程序的一部分,必須繼承java.lang.CloassLoade|)。由不同的類裝載器裝載的類被放在虛擬機內部的不同的命名空間中。方法區(qū):大小不固定,根據需要動態(tài)調整方法區(qū)可以被垃圾回收包含提取裝載的類的信息,放到方法區(qū)JVM總能通過存儲于方法區(qū)的內存信息來確定

7、一個對象需要多少內存類的靜態(tài)變量也放到方法區(qū)。虛擬機為裝載的每個類存儲如下信息:這個類型的全限定名這個類型的直接超類的全限定名這個類型是類類型還是接口類型這個類的訪問權限修飾符任何直接超接口的全限定名的有序列表該類型的常量池該類型所用常量的一個有序集合,包括直接常量(String,Integer,floatingpoint),和對其他類型,字段,方法的符號引用字段信息字段名字段類型字段的修飾符聲明的順序方法信息方法名方法的返回值類型方法的參數和類型,順序方法的修飾符方法的操作碼操作數棧和該方法的棧幀中局部變量區(qū)的大小異常表除了常量以外的所有類(靜態(tài))變量一個到類CloassLoader的引用一

8、個到Class類的引用方法表虛擬機為每一個裝載的非抽象類都生成一個方法表一個java程序獨占一個JVM,一個JVM中只存在一個堆。|所以,每個java程序有它自己的堆,但同一個java程序的1個線程共享一個堆運行時創(chuàng)建的所有類實例數組對象垃圾回收器回收內存移動對象以減少碎片不必是連續(xù)的內存,可以動態(tài)的擴展和收縮一個JVM的實現的方法區(qū)可以在堆頂實現棧幀棧幀由3部分組成:局部變量區(qū),操作數棧,幀數據區(qū)。局部變量區(qū),操作數棧的大小在編譯的時候就確定了。局部變量區(qū)以字長為單位,從。開始計數的數組。int,float,reference,returnaddress只占據一個字長byte,short,c

9、har存入數組前轉換成int,占據一個字長long,double占據2個字長。包含對應方法的參數和局部變量,方法的局部變量任意決定順序,甚至一個索引指代兩個變量,(當2個變量的作用域不重復時)操作數棧以字長為單位的數組,但不是通過索引來訪問,而是通過標準的棧操作存貯數據的方式和局部變量區(qū)一樣。幀數據區(qū)幀數據區(qū)保存常量池解析,正常方法返回,異常派發(fā)機制等信息執(zhí)行引擎線程:JVM只規(guī)定了最高級別的線程會得到大多數的CPU時間,較低優(yōu)先級別的線程,只有在所有比它優(yōu)先級更高的線程全部阻塞的情況下才能保證得到CPU時間。級別低的線程在級別高的線程沒有被阻塞的時候,也可能得到CPU時間,但是這沒有任何保證

10、。每個虛擬機都有一個主存,用于保存所有的程序變量(對象的實例變量,數組的元素,以及類變量)。每一個線程都有一個工作內存,線程用它保存所使用和賦值的“工作拷貝”。局部變量和參數,因為他們是每個線程私有的,可以邏輯上看成是工作內存或者主存的一部分。6字節(jié)碼文件8位字節(jié)的二進制流classFile表的格式Type	NameCountu4magic1u2minor_version1u2major_version1u2constant_pool_count1cp_infoconstant_poolconstant_pool_count-1u2access_flags1u2this_clas

11、s1u2super_class1u2interfaces_count1u2interfacesinterfaces_countu2fields_count1field_infofieldsfields_countu2methodscount1method_infomethodsmethods_countu2attributes_count1attribute_infoattributesattributes_countConstantpooltags常量池標志每一個標志都有一個相對應的表。表名通過在標志后面加上"info"后綴來產生EntryTypeTagValueDesc

12、riptionCONSTANT_Utf81AUTF-8encodedUnicodestringCONSTANT_Integer3AnintliteralvalueCONSTANT_Float4AfloatliteralvalueCONSTANT_Long5AlongliteralvalueCONSTANT_Double6AdoubleliteralvalueCONSTANT_Class7AsymbolicreferencetoaclassorinterfaceCONSTANT_String8AStringliteralvalueCONSTANT_Fieldref9Asymbolicrefere

13、ncetoafieldCONSTANT_Methodref10AsymbolicreferencetoamethoddeclaredinaclassCONSTANT_InterfaceMethodref11AsymbolicreferencetoamethoddeclaredinaninterfaceCONSTANT_NameAndType12Partofasymbolicreferencetoafieldormethod7類型的聲明周期裝載通過該類型的完全限定名,產生一個該類型的二進制數據流解析這個二進制數據流為方法區(qū)內的內部數據結構(并在堆上)創(chuàng)建一個表示該類型的java.lang.Cla

14、ss類的實例連接(已讀入的二進制形式的類型數據合并到虛擬機的運行時狀態(tài)中去)驗證(保證java類型數據格式正確并適合JVM使用)準備(分配內存,默認初始化在此時發(fā)生)解析(把常量池中的符號引用(類,接口,字段,方法)轉換為直接引用,虛擬機的實現可以推遲解析這一步,它可以在當運行中的程序真正使用某個符號引用是再去解析它)初始化(將類變量賦予適當的初始值(顯式初始化),所有JVM的實現必須在每個類或接口首次主動使用是被初始化)對象的生命周期類實例化有四種途徑:new調用Class或者java.lang.reflect.Constructor的newInstance()clone()java.io.

15、ObjectInputStream的getObject()8連接模型動態(tài)連接和解析常量池:class文件把它所有的引用符號保存在一個地方,常量池每個文件有一個常量池每一個被JVM裝載的類或者接口都有一份內部版本的常量池,被稱作運行時常量池運行時常量池映射到class文件的常量池JVM為每一個裝載的類和接口保存一份獨立的常量池。來自相同方法或不同方法中的幾條指令,可能指向同一個常量池入口。每個常量池入口只被解析一次。解析在程序運行的某些時刻,如果某個特定的符號引用將要被使用,它首先要被解析。解析過程就是根據符號引用查找到實體,在把符號引用替換成直接引用的過程。所有的符號引用都保持在常量池,所以這

16、個過程也被稱作常量池解析。解析分為早解析和遲解析。9垃圾收集10棧和局部變量操作StackandLocalVariableOperations10.1 常量入棧操作PushingConstantsOntotheStack10.1.1 將一個字長的常量壓入棧OpcodeOperand(s)Descriptioniconst_m1(none)pushesint-1ontothestackiconst_0(none)pushesint0ontothestackiconst_1(none)pushesint1ontothestackiconst_2(none)pushesint2ontothestac

17、kiconst_3(none)pushesint3ontothestackiconst_4(none)pushesint4ontothestackiconst_5(none)pushesint5ontothestackfconst_0(none)pushesfloat0ontothestackfconst_1(none)pushesfloat1ontothestackfconst_2(none)pushesfloat2ontothestack10.1.2 將一個字長的常量壓入棧longanddoublevaluesoccupy64bits.Eachtimealongordoubleispush

18、edontothestack,itsvalueoccupiestwoslotsonthestack.long和double類型的值是64位長度的值,每當一個long或者double類型的值被壓入棧,將占據2個位置OpcodeOperand(s)Descriptionlconst_0(none)pusheslong0ontothestacklconst_1(none)pusheslong1ontothestackdconst_0(none)pushesdouble0ontothestackdconst_1(none)pushesdouble1ontothestack10.1.3 將空的對象引用(

19、null)壓入棧opcode,Oneotheropcodepushesanimplicitconstantvalueontothestack.Theaconst_nullpushesanullobjectreferenceontothestack.OpcodeOperand(s)Descriptionaconst_null(none)pushesanullobjectreferenceontothestack10.1.4 將byte和short類型常量壓入棧PushingbyteandshortconstantsontothestackOpcodeOperand(s)Descriptionbi

20、pushbyte1expandsbyte1(abytetype)toanintandpushesitontothestack將byte1(數據典型為byte)轉換為int然后將其壓入棧sipushbyte1,byte2expandsbyte1,byte2(ashorttype)toanintandpushesitontothestack將byte1和byte2(數據典型為short)轉換為int然后將其壓入棧10.1.5 將常量池入口壓入棧PushingconstantpoolentriesontothestackOpcodeOperand(s)Descriptionldcindexbyte1

21、pushessingle-wordvaluefromconstantpoolentryspecifiedbyindexbyte1ontothestackldc_windexbyte1,pushessingle-wordvaluefromconstantpoolentryindexbyte2specifiedbyindexbyte1,indexbyte2ontothestackldc2_windexbyte1,pushesdual-wordvaluefromconstantpoolentryindexbyte2specifiedbyindexbyte1,indexbyte2ontothestac

22、k10.2 通用棧操作GenericStackOperations10.2.1 棧操作StackmanipulationOpcodeOperand(s)Descriptionnop(none)donothingpop(none)popthetopwordfromtheoperandstackpop2(none)popthetoptwowordsfromtheoperandstackswap(none)swapthetopoperandstacktwowordsdup(none)duplicatetopoperandstackworddup2(none)duplicatetoptwooperan

23、dstackwordsdup_x1(none)duplicatetopoperandstackwordandputtwodowndup_x2(none)duplicatetopoperandstackwordandputthreedowndup2_x1(none)duplicatetoptwooperandstackwordsandputthreedowndup2_x2(none)duplicatetoptwooperandstackwordsandputfourdown10.3 把局部變量壓入棧PushingLocalVariablesOntotheStack10.3.1 將1個字長的局部變

24、量壓入棧Pushingsingle-wordlocalvariablesontothestackOpcodeOperand(s)Descriptioniloadvindexpushesintfromlocalvariablepositionvindexiload_0(none)pushesintfromlocalvariablepositionzeroiload_1(none)pushesintfromlocalvariablepositiononeiload_2(none)pushesintfromlocalvariablepositiontwoiload_3(none)pushesintf

25、romlocalvariablepositionthreefloadvindexpushesfloatfromlocalvariablepositionvindexfload_0(none)pushesfloatfromlocalvariablepositionzerofload_1(none)pushesfloatfromlocalvariablepositiononefload_2(none)pushesfloatfromlocalvariablepositiontwofload_3(none)pushesfloatfromlocalvariablepositionthree10.3.2

26、將2個字長的局部變量壓入棧Pushingdual-wordlocalvariablesontothestackOpcodeOperand(s)Descriptionlloadvindexpusheslongfromlocalvariablepositionsvindexand(vindex+1)lload_0(none)pusheslongfromlocalvariablepositionszeroandonelload_1(none)pusheslongfromlocalvariablepositionsoneandtwolload_2(none)pusheslongfromlocalvar

27、iablepositionstwoandthreelload_3(none)pusheslongfromlocalvariablepositionsthreeandfourdloadvindexpushesdoublefromlocalvariablepositionsvindexand(vindex+1)dload_0(none)pushesdoublefromlocalvariablepositionszeroandonedload_1(none)pushesdoublefromlocalvariablepositionsoneandtwodload_2(none)dload_3(none

28、)pushesdoublefromlocalvariablepositionstwoandthreepushesdoublefromlocalvariablepositionsthreeandfour10.3.3 將對象引用局部變量壓入棧Table10-9.PushingobjectreferencelocalvariablesontothestackOpcodeOperand(s)Descriptionaloadvindexpushesobjectreferencefromlocalvariablepositionvindexaload_0(none)pushesobjectreferenc

29、efromlocalvariablepositionzeroaload_1(none)pushesobjectreferencefromlocalvariablepositiononeaload_2(none)pushesobjectreferencefromlocalvariablepositiontwoaload_3(none)pushesobjectreferencefromlocalvariablepositionthree10.4 彈由棧頂部元素,將其賦給局部變量PoppingtoLocalVariables10.4.1 彈由一個字長的值,將其賦給局部變量Poppingsingle-

30、wordvaluesintolocalvariablesOpcodeOperand(s)Descriptionistorevindexpopsinttolocalvariablepositionvindexistore_0(none)popsinttolocalvariablepositionzeroistore_1(none)popsinttolocalvariablepositiononeistore_2(none)popsinttolocalvariablepositiontwoistore_3(none)popsinttolocalvariablepositionthreefstore

31、vindexpopsfloattolocalvariablepositionvindexfstore_0(none)popsfloattolocalvariablepositionzerofstore_1(none)popsfloattolocalvariablepositiononefstore_2(none)popsfloattolocalvariablepositiontwofstore_3(none)popsfloattolocalvariablepositionthree10.4.2 彈由2個字長的值,將其賦給局部變量Poppingdual-wordvaluesintolocalva

32、riablesOpcodeOperand(s)Descriptionlstorevindexpopslongtolocalvariablepositionsvindexand(vindex+1)lstore_0(none)popslongtolocalvariablepositionszeroandonelstore_1(none)popslongtolocalvariablepositionsoneandtwolstore_2(none)popslongtolocalvariablepositionstwoandthreelstore_3(none)popslongtolocalvariab

33、lepositionsthreeandfourdstorevindexpopsdoubletolocalvariablepositionsvindexand(vindex+1)dstore_0(none)popsdoubletolocalvariablepositionszeroandonedstore_1(none)popsdoubletolocalvariablepositionsoneandtwodstore_2(none)popsdoubletolocalvariablepositionstwoandthreedstore_3(none)popsdoubletolocalvariabl

34、epositionsthreeandfour10.4.3 彈由對象引用,將其賦給局部變量PoppingobjectreferencesintolocalvariablesOpcodeOperand(s)Descriptionastorevindexpopsobjectreferencetolocalvariablepositionvindexastore_0(none)popsobjectreferencetolocalvariablepositionzeroastore_1(none)popsobjectreferencetolocalvariablepositiononeastore_2(

35、none)popsobjectreferencetolocalvariablepositiontwoastore_3(none)popsobjectreferencetolocalvariablepositionthree10.5 wide指令ThewideInstruction10.5.1 彈由對象引用,將其賦給局部變量Poppingobjectreferencesintolocalvariables無符號8位局部變量索引,把方法中的局部變量限制在256以下。一條單獨的wide指令,可將8位的索引再擴展8位。這樣就可以把局部變量的限制擴展到65536OpcodeOperand(s)Descr

36、iptionwideiload,indexbyte2indexbyte1,pushesintfromlocalvariablepositionindexwidelload,indexbyte2indexbyte1,pusheslongfromlocalvariablepositionindexwidefload,indexbyte2indexbyte1,pushesfloatfromlocalvariablepositionindexwidedload,indexbyte1,pushesdoublefromlocalvariablepositionindexbyte2indexwidealoa

37、d,indexbyte1,pushesobjectreferencefromlocalvariableindexbyte2positionindexwideistore,indexbyte1,popsinttolocalvariablepositionvindexindexbyte2widelstore,indexbyte2indexbyte1,popslongtolocalvariablepositionindexwidefstore,indexbyte2indexbyte1,popsfloattolocalvariablepositionindexwidedstore,indexbyte2

38、indexbyte1,popsdoubletolocalvariablepositionindexwideastore,indexbyte1,popsobjectreferencetolocalvariablepositionindexbyte2index11類型轉換TypeConversion11.1 longs,floats,anddoubles類型之間的轉換Convertingints,longs,floats,anddoublesOpcodeOperand(s)Descriptioni2l(none)convertsinttolongi2f(none)convertsinttofloa

39、ti2d(none)convertsinttodoublel2i(none)convertslongtointl2f(none)convertslongtofloatl2d(none)convertslongtodoublef2i(none)convertsfloattointf2l(none)convertsfloattolongf2d(none)convertsfloattodoubled2i(none)convertsdoubletointd2l(none)convertsdoubletolongd2f(none)convertsdoubletofloat11.2 int數據類型向byt

40、e,char,short類型的轉換Convertingints,bytes,chars,andshorts.Noopcodesexistthatconvertdirectlyfromalong,float,ordoubletothetypessmallerthanintJava虛擬機中沒有把long,float,ordouble類型值直接轉換成比int類型占據更小的空間的數據類型的操作碼。Thereforeconvertingfromafloattoabyte,forexample,requirestwosteps.Firstthefloatmustbeconvertedtoanintwith

41、f2i,thentheresultingintcanbeconvertedtoabytewithi2b.因此,把float類型值轉換為byte類型需要兩個步驟,首先,float類型值必須通過指令轉換為int類型值,然后,所得的int值,再通過i2b指令轉換為byte類型值Althoughopcodesexistthatconvertaninttoprimitivetypessmallerthanint(byte,short,andchar),noopcodesexistthatconvertintheoppositedirection.Thisisbecauseanybytes,shorts,

42、orcharsareeffectivelyconvertedtointbeforebeingpushedontothestack.盡管有操作碼可以把int類型的值轉換為比int類型值占據更小空間的數據類型(byte,short,andchar),但并不存在執(zhí)行相反方向轉換操作的操作碼,因為任何byte,short,andchar類型值在壓入棧的時候,就已經有效的被轉換成int類型值了。Arithmeticoperationsuponbytes,shorts,andcharsaredonebyfirstconvertingthevaluestoint,performingthearithmeti

43、coperationsontheints,andbeinghappywithanintresult.涉及bytes,shorts,andchars類型的運算操作首先會把這些值轉換成int類型,然后對int類型的值進行計算,最后得到int類型的結果。OpcodeOperand(s)Descriptioni2b(none)convertsinttobytei2c(none)convertsinttochari2s(none)convertsinttoshort12整數運算IntegerArithmetictwo'scomplement補碼Allintegertypessupportedby

44、theJavaVirtualMachine-bytes,shorts,ints,andlongs-aresignedtwo's-complementnumbers.Java虛擬機支持的所有整數類型,bytes,shorts,ints,andlongs,他們都是帶符號的二進制補碼數。Thetwo's-complementschemeallowsbothpositiveandnegativeintegerstoberepresented.二進制補碼方案,既能描述正整數,又能描述負整數Themostsignificantbitofatwo's-complementnumber

45、isitssignbit.Thesignbitisonefornegativenumbersandzeroforpositivenumbersandforthenumberzero.符號位為1表示負整數,符號為0表示表示正整數和數字0Thenumberofuniquevaluesthatcanberepresentedbythetwo's-complementschemeistworaisedtothepowerofthetotalnumberofbits能被二進制補碼方案表示的數的范圍為:2的總位數次募Forexample,theshorttypeinJavaisa16-bitsig

46、nedtwo's-complementinteger.Thenumberofuniqueintegersthatcanberepresentedbythisschemeis216,or65,536.例如,short在java中是16位的帶符號的二進制補碼整數,能夠唯一表示的整數為216,或者65,536Halfoftheshorttype'srangeofvaluesareusedtorepresentzeroandpositivenumbers;theotherhalfoftheshorttype'srangeareusedtorepresentnegativenum

47、bers.Short類型值范圍的一半用來表示0和正整數,另一般用來表示負整數。Therangeofnegativevaluesfora16-bittwo's-complementnumberis-32,768(0x8000)to-1(0xffff).Zerois0x0000.Therangeofpositivevaluesisone(0x0001)to32,767(0x7fff).16位2進制補碼負數的范圍是-32,768(0x8000)to-1(0xffff).0用0x0000來表示.正整數的范圍是(0x0001)to32,767(0x7fff).Positivenumbersare

48、intuitiveinthattheyaremerelythebasetworepresentationofthenumber.Negativenumberscanbecalculatedbyaddingthenegativenumbertotworaisedtothepowerofthetotalnumberofbits.整數直覺上只不過是數的兩種表示法之一。負數可以通過負數和2的某次方哥相加而得出。Forexample,thetotalnumberofbitsinashortis16,sothetwo's-complementrepresentationofanegativenum

49、berinthevalidrangeforashort(-32,768to-1)canbecalculatedbyaddingthenegativenumberto216,or65,536.Thetwo's-complementrepresentationfor-1is65,536+(-1)or65,535(0xffff).Thetwo's-complementrepresentationfor-2is65,536+(-2)or65,534(0xfffe).例如,short類型的長度為16位。因此2進制補碼表示法可以通過一個負數和2的16次哥的相加來得到一個有效范圍內的負數。-

50、1的二進制補碼表示為65,536+(-1)or65,535(0xffff).-2的二進制補碼表示為65,536+(-2)or65,534(0xfffe).Additionisperformedontwo's-complementsignednumbersinthesamewayitwouldbeperformedonunsignedbinarynumbers.Thetwonumbersareadded,overflowisignored,andtheresultisinterpretedasasignedtwo's-complementnumber.Thiswillworkas

51、longastheresultisactuallywithintherangeofvalidvaluesforthetype.Forexample,toadd4+(-2),justadd0x00000004and0xfffffffe.Theresultisactually0x100000002,butbecausethereareonly32bitsinanint,theoverflowisignoredandtheresultbecomes0x00000002.在帶符號的二進制補碼數上進行加法運算,與在無符號二進制數上進行加法運算一樣。兩個數相加(忽略溢出),結果被解釋為一個帶符號的二進制補

52、碼數。這個過程將在運算結果是該類型的有效范圍內的情況下運行。例如要獲得4+(-2)的結果,只要把0x00000004and0xfffffffe相加即可.結果是0x100000002,但因為int類型只有32位,于是溢出部分被忽略,結果為0x00000002.0000000000000000000000000000010011111111111111111111111111111110+10000000000000000000000000000010OverflowinintegeroperationsdoesnotthrowanyexceptionintheJavaVirtualMachine

53、.Theresultismerelytruncatedtofitintotheresulttype(eitherintorlong).Forexample,addingints0x7ffffffand1yields0x80000000.ThismeansthattheJavaVirtualMachinewillreportthat2,147,483,647+1=-2,147,483,648,ifthetypeofthevaluesbeingaddedareintsandnotlongs.AsyouprograminJava,youmustkeepinmindthatoverflowcanhap

54、penandmakesureyouchoosetheappropriatetype,intorlong,ineachsituation.IntegerdivisionbyzerodoesthrowanArithmeticException,soyoushouldalsokeepinmindthatthisexceptioncouldbethrownandcatchitifnecessary.Java虛擬機中整數運算的溢出并不會導致拋出異常。其結果只被簡單的截斷以符合數據類型(或者為int,或者為long)。例如把int值0x7ffffff和1相加,將會得到0x80000000.因此如果相加的值的類型為int而非long,java虛擬機中2,147,483,647+1的結果將是-2,147,483,648。在java中編程時,你必須隨時注意可能發(fā)生的溢出,必須在每種情況下確認所選擇的數據類型(intorlong)是否正確。整數被0除會拋出一個ArithmeticException異常,所以應該時刻牢記此類異常將會拋出,必須在必要的時候捕獲異常。Ifyouencounterasituationinwhichlongjustisn'tlongenou

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論