1. 句柄是什麼意思
句柄(handle),有兩種解釋
1,句柄是一種特殊的智能指針。當一個應用程序要引用其他系統(如資料庫、操作系統)所管理的內存塊或對象時,就要使用句柄。
2,整個Windows編程的基礎。一個句柄是指使用的一個唯一的整數值,即一個4位元組長的數值,來標識應用程序中的不同對象和同類中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控制項或者文件等。
(1)句柄的靜態存儲擴展閱讀:
注意事項:
1,內核對象句柄,是用來標識某個內核對象的一個ID同一個對象的該id對於每個進程是不同的,具體如何實現是ms不公開的演算法,以下是一個近似的,可能的演算法。
2,進程創建時,windows系統為進程構造了一個句柄表。
3,當該進程希望獲得一個內核對象句柄或者創建一個內核對象從而獲得該對象句柄時。
4,系統會將在句柄表中增加一個表項,表項的內容中存儲了指向目標內核對象的指針。
同時,系統返回這個表項在句柄表中的索引作為句柄。
你可以對窗口、文件使用句柄,也能對分配了的內存、圖象使用句柄。可以把句柄理解為與指針類似。你必須通過某種方式來創建句柄;而且在使用完後銷毀掉,不然將造成資源泄漏而使你的系統癱瘓。所以要保證它們在某個時候被銷毀了。
當你調用某個API函數時,你傳入的句柄在函數內部會先進行句柄合法性的檢查,合法的句柄才能訪問系統資源,非法的句柄將不能執行函數代碼,從而保證了系統的可靠運行。
2.線程(threads, 台灣稱 執行緒),也被稱為輕量進程(lightweight processes)。計算機科學術語,指運行中的程序的調度單位。
線程是進程中的實體,一個進程可以擁有多個線程,一個線程必須有一個父進程。線程不擁有系統資源,只有運行必須的一些數據結構;它與父進程的其它線程共享該進程所擁有的全部資源。線程可以創建和撤消線程,從而實現程序的並發執行。一般,線程具有就緒、阻塞和運行三種基本狀態。
在多中央處理器的系統里,不同線程可以同時在不同的中央處理器上運行,甚至當它們屬於同一個進程時也是如此。大多數支持多處理器的操作系統都提供編程介面來讓進程可以控制自己的線程與各處理器之間的關聯度(affinity)。3
4..網路硬碟,顧名思義就是類似於計算機硬碟,具有計算機硬碟的 一切儲存功能,只不過它是應用與網路中的儲存,是一種虛擬的網路存儲硬體.
另外還有二級緩存。就是處理器緩存。或者叫高速緩沖存儲器。是位於CPU和主存儲器DRAM(Dynamic RAM)之間的規模較小的但速度很高的存儲器,通常由SRAM(靜態隨機存儲器)組成。用來存放那些被CPU頻繁使用的數據,以便使CPU不必依賴於速度較慢的DRAM(動態隨機存儲器)。二級高速緩存一直都屬於速度極快而價格也相當昂貴的一類內存,稱為SRAM(靜態RAM),SRAM(Static RAM)是靜態存儲器的英文縮寫。由於SRAM採用了與製作CPU相同的半導體工藝,因此與動態存儲器DRAM比較,SRAM的存取速度快,但體積較大,價格較高。
6.OLE是Object Linking and Embedding的縮寫,直譯為對象連接與嵌入,學過VB的朋友可能知道VB中有一種控制項就叫OLE對象,通過這個控制項就可以調用其他格式的數據。其實,OLE技術在辦公中的應用就是滿足用戶在一個文檔中加入不同格式數據的需要(如文本、圖像、聲音等),即解決建立復合文檔問題。OO中OLE和上述概念完全一致,只不過是採用更為完善的組件技術,通過OLE這座橋梁可以極為方便實現OO中各個功能模塊的相互調用與協同工作來創建復合文檔。
3. java 每個函數的棧空間大小是
在Java程序運行時,各個棧空間大小如下:
(1) 寄存器。最快的保存區域,位於處理器內部,數量十分有限,它是根據需要由編譯器分配。我們對此沒有直接的控制權.
(2) 棧(stack)。駐留於常規RAM(隨機訪問存儲器)區域,這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,Java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」。這失去了一定的靈活性,因此對象句柄是存放在棧中,但Java對象並不放到其中。
(3) 堆(heap)。保存了Java對象。和棧不同,它最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會花掉更長的時間!
(4) 靜態存儲。這兒的「靜態」(Static)是指「位於固定位置」(盡管也在RAM里)。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但Java對象本身永遠都不會置入靜態存儲空間。
(5) 常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的,因為它們永遠都不會改變。有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。
(6) 非RAM存儲。數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。
4. 什麼是句柄有什麼用
所謂句柄實際上是一個數據,是一個Long (整長型)的數據。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
5. 電腦中提到的「句柄」是什麼意思
所謂句柄實際上是一個數據,是一個Long
(整長型)的數據。
句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。
從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內存地址。應用程序啟動後,組成這個程序的各對象是住留在內存的。如果簡單地理解,似乎我們只要獲知這個內存的首地址,那麼就可以隨時用這個地址訪問對象。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬內存為基礎的操作系統。在這種系統環境下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該對象呢?
為了解決這個問題,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。
句柄地址(穩定)→記載著對象在內存中的地址————→對象在內存中的地址(不穩定)→實際對象
本質:WINDOWS程序中並不是用物理地址來標識一個內存塊,文件,任務或動態裝入模塊的,相反的,WINDOWS
API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。
但是必須注意的是程序每次從新啟動,系統不能保證分配給這個程序的句柄還是原來的那個句柄,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那麼系統給應用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。
6. 菜鳥:剛學java,堆區,棧區,靜態區,代碼區,暈了!!!!!
你問題太多了。簡單為你解答一下吧,JAVA語言的內存管理分為棧內存,堆內存和方法區,棧內存用來存儲基本數據類型和對象的引用(對象的實體和引用這兩個概念你要搞明白),堆內存用來存儲對象的實體。。你記住,JAVA是一門面向對象的語言,在JAVA理萬事萬物都是對象,除了兩個東西:1,8個基本數據類型(對應的,還有8個相關的包裝類,但是為了JAVA運行速度的考慮,SUN公司保留了這8個基本數據類型);2,就是你所謂的入口方法,即main方法;這兩點是JAVA不是純粹的面向對象語言的表現,也就是他比較特殊的地方,你記住就行了;接下來,我們來看棧內存和堆內存,JAVA裡面所有東西都是對象,那麼對象保存在哪呢?其實,對象里的所有東西保存在堆內存里,裡麵包括了這個對象的成員變數和方法等東西,而棧內存里,保存的是這個對象所屬的這塊堆內存的首地址?也就是一個16進制的數字,明白了?因為你要告訴JAVA虛擬機從哪裡去開始讀取這塊堆內存啊。所以,你明白棧內存用來存儲基本數據類型和對象的引用,堆內存用來存儲對象的實體了。。而內存管理裡面還有一塊叫方法區,這是JAVA虛擬機用來在執行一個JAVA程序之前保存這個程序的結構等級的地方,虛擬機按照這個結構等級來調用程序里德對象方法等,而靜態變數和靜態方法正是保存在方法區里,所以靜態方法可以在不創建對象的時候就調用,因為創建對象就是為對象分配堆內存,只有創建了對象之後才能調用對象的非靜態方法和非靜態變數。。你的第一個問題就能解答了,這個情況就是zhangsan的堆內存里保存的car對象的引用,而這個引用又指向car對象的堆內存;對象的成員變數是保存在自己的堆內存里的;而入口類是一個特殊的東西,你特殊對待就行了。
7. java里的靜態成員變數是放在了堆內存還是棧內存
堆區:
1.存儲的全部是對象,每個對象都包含一個與之對應的class的信息。(class的目的是得到操作指令)
2.jvm只有一個堆區(heap)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身
棧區:
1.每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象),對象都存放在堆區中
2.每個棧中的數據(原始類型和對象引用)都是私有的,其他棧不能訪問。
3.棧分為3個部分:基本類型變數區、執行環境上下文、操作指令區(存放操作指令)。
方法區:
1.又叫靜態區,跟堆一樣,被所有的線程共享。方法區包含所有的class和static變數。
2.方法區中包含的都是在整個程序中永遠唯一的元素,如class,static變數。
程序運行時,我們最好對數據保存到什麼地方做到心中有數。特別要注意的是內在的分配,有六個地方都可以保存數據:
1、 寄存器。這是最快的保存區域,因為它位於和其他所有保存方式不同的地方:處理器內部。然而,寄存器的數量十分有限,所以寄存器是根據需要由編譯器分配。我們對此沒有直接的控制權,也不可能在自己的程序里找到寄存器存在的任何蹤跡。
2、 堆棧。駐留於常規RAM(隨機訪問存儲器)區域。但可通過它的「堆棧指針」獲得處理的直接支持。堆棧指針若向下移,會創建新的內存;若向上移,則會釋放那些內存。這是一種特別快、特別有效的數據保存方式,僅次於寄存器。創建程序時,java編譯器必須准確地知道堆棧內保存的所有數據的「長度」以及「存在時間」。這是由於它必須生成相應的代碼,以便向上和向下移動指針。這一限制無疑影響了程序的靈活性,所以盡管有些java數據要保存在堆棧里——特別是對象句柄,但java對象並不放到其中。
3、 堆。一種常規用途的內存池(也在RAM區域),其中保存了java對象。和堆棧不同:「內存堆」或「堆」最吸引人的地方在於編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間。因此,用堆保存數據時會得到更大的靈活性。要求創建一個對象時,只需用new命令編制相碰的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存。當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會花掉更長的時間
4、 靜態存儲。這兒的「靜態」是指「位於固定位置」。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的特定元素是靜態的。但java對象本身永遠都不會置入靜態存儲空間。
5、 常數存儲。常數值通常直接置於程序代碼內部。這樣做是安全的。因為它們永遠都不會改變,有的常數需要嚴格地保護,所以可考慮將它們置入只讀存儲器(ROM)。
6、 非RAM存儲。若數據完全獨立於一個程序之外,則程序不運行時仍可存在,並在程序的控制范圍之外。其中兩個最主要的例子便是「流式對象」和「固定對象」。對於流式對象,對象會變成位元組流,通常會發給另一台機器,而對於固定對象,對象保存在磁碟中。即使程序中止運行,它們仍可保持自己的狀態不變。對於這些類型的數據存儲,一個特別有用的技藝就是它們能存在於其他媒體中,一旦需要,甚至能將它們恢復成普通的、基於RAM的對象。
8. java對象保存時,方法是如何保存的
你是說hibernate的對象持久話?
那個是存進資料庫,。
java對象的方法在編譯後,就有固定的內存空間,在類被載入到內存(對象沒有創建時)就已經在內存了。你說咋保存的,當然是在內存了。
9. 句柄是什麼
句柄是一種不透明指針,通常用來對用戶隱藏數據結構實現,這樣可以防止用戶任意修改數據對象的內容,所有操作必須通過相應API進行,這是一種OOP中常見的概念,即信息隱藏(封裝),好處是實現者可以隨意修改數據結構實現也不用影響客戶代碼。比如Win32上有個叫HANDLE的類型,其定義成類型void*這種不透明指針,用戶無從知道具體對應的結構體。
就像vbtrazz所說,也可以是資源編號,任何可以唯一標識一個對象的東西都可以說是句柄,好處上面已經提及。
10. java里的靜態成員變數是放在了堆內存還是棧內
這個要看對象是否為逃逸對象,如果為非逃逸對象,會根據標量替換來把對象分解成若干個被這個方法使用的成員變數所代替,這些代替的成員變數在棧幀或寄存器上分配空間