深刻解析java虛擬機。本站提示廣大學習愛好者:(深刻解析java虛擬機)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析java虛擬機正文
java虛擬機是甚麼
“java虛擬機”能夠指以下三種器械:
1)、籠統標准;
2)、一個詳細的完成;
3)、一個運轉中的虛擬機實例;
java虛擬機性命周期
啟動
當啟動一個java法式時,一個虛擬機實例出生。
虛擬機實例經由過程挪用某個初始類的public static void main(String[] args)辦法來運轉一個java法式。
任何具有如許一個main辦法的類都可以作為java法式運轉的終點,所以必需要告知虛擬機初始類的稱號,全部法式將從它的main辦法開端運轉。
滅亡
初始類的main辦法作為法式初始線程的終點,任何其他線程都是由初始線程啟動。
java虛擬機外部有兩種線程:守護線程和非守護線程。
守護線程,平日是虛擬機應用的線程,如履行渣滓搜集。java法式也能夠把創立的線程標志為守護線程。
非守護線程,java中的初始線程,就是開端於main辦法的線程長短守護線程。
只需法式中有非守護線程在運轉,那末java法式也在持續運轉(虛擬機依然存活),當法式中一切的非守護線程都終止時,虛擬機實例主動加入。
法式自己也能夠經由過程Runtime類或System類的exit()辦法加入。
java虛擬機系統構造
類裝載子體系
1)、擔任查找並裝載類型,分紅裝載、銜接和初始化,在java類型性命周期中有具體解釋;
2)、有兩品種裝載器:啟動類裝載器和用戶自界說類裝載器;
用戶自界說類裝載器必需派生自java.lang.ClassLoader類。
運轉時數據區
辦法區
被裝載類型的信息存儲在辦法區中,具體以下:
根本信息
1)、類型的全限制名;
2)、類型的直接超類的全限制名;
3)、類型是類類型照樣接口類型;
4)、類型的拜訪潤飾符;
5)、直接超接口的全限制名;
其他信息
1)、類型的常量池;
2)、字段信息;
3)、辦法信息;
4)、除常量認為的一切靜態變量;
5)、一個到ClassLoader類的援用;
6)、一個到Class類的援用;
堆
1)、運轉時創立的一切類實例和數組都放在堆中;
2)、一個java虛擬機實例只存在一個堆空間,是以虛擬機中的一切線程都同享這個堆;
3)、一個java法式獨有一個java虛擬機實例,是以每一個java法式都有他本身的堆空間;
java棧
1)、每啟動一個新線程時,java虛擬機都邑為他分派一個java棧;
2)、java棧以幀為單元保留線程的運轉狀況;
3)、java虛擬機對java棧只履行兩種操作:壓棧和出棧;
4)、壓棧:每當線程挪用一個java辦法時,虛擬機都邑在該線程的java棧中壓入一個新幀。應用這個幀來存儲參數、部分變量、中央運算成果等;
5)、出棧:當java辦法經由過程return正常前往,或經由過程拋出異常中斷,虛擬機都邑將以後幀彈出java棧然後釋放失落;
6)、棧數據是線程公有的,所以不須要斟酌多線程情形下棧數據的拜訪同步成績;
棧幀
1)、棧幀由三部門構成:部分變量區、操作數區和棧數據區;
PC存放器
1)、關於運轉中的java法式,每一個線程都有本身的pc存放器;
2)、線程啟動時創立;
3)、當線程履行某個java辦法時,PC存放器的內容老是下一條將被履行指令的地址。
當地辦法棧
1)、任何當地辦法接口都邑應用當地辦法棧;
履行引擎
1)、履行引擎是java虛擬機完成的焦點;
2)、“履行引擎”可以有三種懂得:
a)、一個是籠統的標准;
b)、一個是詳細的完成;
c)、一個是正在運轉的實例;
3)、履行引擎的行動應用指令集來界說。關於每條指令,標准都劃定了履行該指令時應當處置甚麼,假如處置不做劃定;
待細化。。。
(六)ListCtrl列表控件的應用示例
ListCtrl這個控件比擬壯大,是我比擬愛好應用的控件之一。
上面是list_report.py中供給的簡略用法:
import wx import sys, glob, random import data class DemoFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "wx.ListCtrl in wx.LC_REPORT mode", size=(600,400)) il = wx.ImageList(16,16, True) for name in glob.glob("smicon??.png"): bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG) il_max = il.Add(bmp) self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT) self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL) # Add some columns for col, text in enumerate(data.columns): self.list.InsertColumn(col, text) # add the rows for item in data.rows: index = self.list.InsertStringItem(sys.maxint, item[0]) for col, text in enumerate(item[1:]): self.list.SetStringItem(index, col+1, text) # give each item a random image img = random.randint(0, il_max) self.list.SetItemImage(index, img, img) # set the width of the columns in various ways self.list.SetColumnWidth(0, 120) self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE) self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE) self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER) app = wx.PySimpleApp() frame = DemoFrame() frame.Show() app.MainLoop()
若何獲得選中的項目?
最經常使用的辦法就是獲得選中的第一項:GetFirstSelected(),這個函數前往一個int,即ListCtrl中的項(Item)的ID。
還有一個辦法是:GetNextSelected(itemid),獲得指定的itemid以後的第一個被選中的項,異樣也是前往itemid。
經由過程這兩個辦法,我們便可以遍歷一切選中的項了。