国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

JAVA虛擬機內存分配與回收機制

開發 后端
Java虛擬機(Java Virtual Machine) 簡稱JVM Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。本文主要介紹JAVA虛擬機內存的分配與回收。

Java虛擬機(Java Virtual Machine) 簡稱JVM Java虛擬機是一個想象中的機器,在實際的計算機上通過軟件模擬來實現。Java虛擬機有自己想象中的硬件,如處理器、堆棧、寄存器等,還具有相應的指令系統。

Java把內存劃分成兩種:一種是棧內存,一種是堆內存。

在函數中定義的一些基本類型的變量和對象的引用變量都在函數的棧內存中分配。

當在一段代碼塊定義一個變量時,Java就在棧中為這個變量分配內存空間,當超過變量的作用域后,Java會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。

堆內存用來存放由new創建的對象和數組。

在堆中分配的內存,由Java虛擬機的自動垃圾回收器來管理。

在堆中產生了一個數組或對象后,還可以在棧中定義一個特殊的變量,讓棧中這個變量的取值等于數組或對象在堆內存中的首地址,棧中的這個變量就成了數組或對象的引用變量。

引用變量就相當于是為數組或對象起的一個名稱,以后就可以在程序中使用棧中的引用變量來訪問堆中的數組或對象。

具體的說:

棧與堆都是Java用來在Ram中存放數據的地方。與C++不同,Java自動管理棧和堆,程序員不能直接地設置棧或堆。

Java的堆是一個運行時數據區,類的(對象從中分配空間。這些對象通過new、newarray、anewarray和multianewarray等 指令建立,它們不需要程序代碼來顯式的釋放。堆是由垃圾回收來負責的,堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因為它是在運行時 動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但缺點是,由于要在運行時動態分配內存,存取速度較慢。

棧的優勢是,存取速度比堆要快,僅次于寄存器,棧數據可以共享。但缺點是,存在棧中的數據大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本類型的變量(,int, short, long, byte, float, double, boolean, char)和對象句柄。

棧有一個很重要的特殊性,就是存在棧中的數據可以共享。假設我們同時定義:

 

  1. int a = 3;  
  2. int b = 3; 

 

編譯器先處理int a = 3;首先它會在棧中創建一個變量為a的引用,然后查找棧中是否有3這個值,如果沒找到,就將3存放進來,然后將a指向3。接著處理int b = 3;在創建完b的引用變量后,因為在棧中已經有3這個值,便將b直接指向3。這樣,就出現了a與b同時均指向3的情況。這時,如果再令a=4;那么編譯器 會重新搜索棧中是否有4值,如果沒有,則將4存放進來,并令a指向4;如果已經有了,則直接將a指向這個地址。因此a值的改變不會影響到b的值。要注意這 種數據的共享與兩個對象的引用同時指向一個對象的這種共享是不同的,因為這種情況a的修改并不會影響到b, 它是由編譯器完成的,它有利于節省空間。而一個對象引用變量修改了這個對象的內部狀態,會影響到另一個對象引用變量。

String是一個特殊的包裝類數據。可以用:

 

  1. String str = new String("abc");  
  2. String str = "abc"

 

兩種的形式來創建,第一種是用new()來新建對象的,它會在存放于堆中。每調用一次就會創建一個新的對象。

而第二種是先在棧中創建一個對String類的對象引用變量str,然后查找棧中有沒有存放"abc",如果沒有,則將"abc"存放進棧,并令str指向“abc”,如果已經有“abc” 則直接令str指向“abc”。

比較類里面的數值是否相等時,用equals()方法;當測試兩個包裝類的引用是否指向同一個對象時,用==,下面用例子說明上面的理論。

 

  1. String str1 = "abc";  
  2. String str2 = "abc";  
  3. System.out.println(str1==str2); //true可以看出str1和str2是指向同一個對象的。  
  4. String str1 =new String ("abc");  
  5. String str2 =new String ("abc");  
  6. System.out.println(str1==str2); // false用new的方式是生成不同的對象。每一次生成一個。 

 

因此用第二種方式創建多個“abc”字符串,在內存中其實只存在一個對象而已. 這種寫法有利與節省內存空間. 同時它可以在一定程度上提高程序的運行速度,因為JVM會自動根據棧中數據的實際情況來決定是否有必要創建新對象。而對于String str = new String("abc");的代碼,則一概在堆中創建新對象,而不管其字符串值是否相等,是否有必要創建新對象,從而加重了程序的負擔。

另一方面, 要注意: 我們在使用諸如String str = "abc";的格式定義類時,總是想當然地認為,創建了String類的對象str。擔心陷阱!對象可能并沒有被創建!而可能只是指向一個先前已經創建的 對象。只有通過new()方法才能保證每次都創建一個新的對象。 由于String類的immutable性質,當String變量需要經常變換其值時,應該考慮使用StringBuffer類,以提高程序效率。

java中內存分配策略及堆和棧的比較

一、內存分配策略

按照編譯原理的觀點,程序運行時的內存分配有三種策略,分別是靜態的,棧式的,和堆式的.靜態存儲分配是指在編譯時就能確定每個數據目標在運行時刻的存儲空間需求,因而在編譯時就可以給他們分配固定的內存空間.這種分配策略要求程序代碼中不允 許有可變數據結構(比如可變數組)的存在,也不允許有嵌套或者遞歸的結構出現,因為它們都會導致編譯程序無法計算準確的存儲空間需求.

棧式存儲分配也可稱為動態存儲分配,是由一個類似于堆棧的運行棧來實現的.和靜態存儲分配相反,在棧式存儲方案中,程序對數據區的需求在編譯時是完全未知 的,只有到運行的時候才能夠知道,但是規定在運行中進入一個程序模塊時,必須知道該程序模塊所需的數據區大小才能夠為其分配內存.和我們在數據結構所熟知 的棧一樣,棧式存儲分配按照先進后出的原則進行分配。

靜態存儲分配要求在編譯時能知道所有變量的存儲要求,棧式存儲分配要求在過程的入口處必須知道所有的存儲要求,而堆式存儲分配則專門負責在編譯時或運行時 模塊入口處都無法確定存儲要求的數據結構的內存分配,比如可變長度串和對象實例.堆由大片的可利用塊或空閑塊組成,堆中的內存可以按照任意順序分配和釋 放.

二、堆和棧的比較

上面的定義從編譯原理的教材中總結而來,除靜態存儲分配之外,都顯得很呆板和難以理解,下面撇開靜態存儲分配,集中比較堆和棧:從堆和棧的功能和作用來通俗的比較,堆主要用來存放對象的,棧主要是用來執行程序的.而這種不同又主要是由于堆和棧的特點決定的:在編程中,例如C/C++中,所有的方法調用都是通過棧來進行的,所有的局部變量,形式參數都是從棧中分配內存空間的。

實際上也不是什么分配,只是從棧頂 向上用就行,就好像工廠中的傳送帶(conveyor belt)一樣,Stack Pointer會自動指引你到放東西的位置,你所要做的只是把東西放下來就行.退出函數的時候,修改棧指針就可以把棧中的內容銷毀.這樣的模式速度最快, 當然要用來運行程序了.

需要注意的是,在分配的時候,比如為一個即將要調用的程序模塊分配數據區時,應事先知道這個數據區的大小,也就說是雖然分配是在程 序運行時進行的,但是分配的大小多少是確定的,不變的,而這個"大小多少"是在編譯時確定的,不是在運行時.

堆是應用程序在運行的時候請求操作系統分配給自己內存,由于從操作系統管理的內存分配,所以在分配和銷毀時都要占用時間,因此用堆的效率非常低.但是堆的 優點在于,編譯器不必知道要從堆里分配多少存儲空間,也不必知道存儲的數據要在堆里停留多長的時間,因此,用堆保存數據時會得到更大的靈活性。

事實上,面 向對象的多態性,堆內存分配是必不可少的,因為多態變量所需的存儲空間只有在運行時創建了對象之后才能確定.在C++中,要求創建一個對象時,只需用 new命令編制相關的代碼即可。執行這些代碼時,會在堆里自動進行數據的保存.當然,為達到這種靈活性,必然會付出一定的代價:在堆里分配存儲空間時會花 掉更長的時間!

這也正是導致我們剛才所說的效率低的原因,看來列寧同志說的好,人的優點往往也是人的缺點,人的缺點往往也是人的優點.

三、JVM中的堆和棧

JVM是基于堆棧的虛擬機.JVM為每個新創建的線程都分配一個堆棧.也就是說,對于一個Java程序來說,它的運行就是通過對堆棧的操作來完成的。堆棧以幀為單位保存線程的狀態。JVM對堆棧只進行兩種操作:以幀為單位的壓棧和出棧操作。

我們知道,某個線程正在執行的方法稱為此線程的當前方法.我們可能不知道,當前方法使用的幀稱為當前幀。當線程激活一個Java方法,JVM就會在線程的 Java堆棧里新壓入一個幀。

這個幀自然成為了當前幀.在此方法執行期間,這個幀將用來保存參數,局部變量,中間計算過程和其他數據.這個幀在這里和編譯 原理中的活動紀錄的概念是差不多的.從Java的這種分配機制來看,堆棧又可以這樣理解:堆棧(Stack)是操作系統在建立某個進程時或者線程(在支持多線程的操作系統中是線程)為這個線程建立的存儲區域,該區域具有先進后出的特性。

每一個Java應用都唯一對應一個JVM實例,每一個實例唯一對應一個堆。應用程序在運行中所創建的所有類實例或數組都放在這個堆中,并由應用所有的線程 共享.跟C/C++不同,Java中分配堆內存是自動初始化的。

Java中所有對象的存儲空間都是在堆中分配的,但是這個對象的引用卻是在堆棧中分配,也 就是說在建立一個對象時從兩個地方都分配內存,在堆中分配的內存實際建立這個對象,而在堆棧中分配的內存只是一個指向這個堆對象的指針(引用)而已。

【編輯推薦】

  1. 高性能Java代碼之內存管理
  2. Java中finalize()的另類用法
  3. JavaScript實現二級聯動下拉框
  4. java算法之字符組合排序
  5. Java多線程程序設計詳細解析
責任編輯:于鐵 來源: 考試大
相關推薦

2013-04-01 10:07:19

Java內存回收機制

2011-07-04 13:12:04

JavaScript

2011-01-18 14:06:58

JavaScriptweb

2009-12-09 17:28:34

PHP垃圾回收機制

2020-03-10 09:30:11

Java內存數據

2009-06-23 14:15:00

Java垃圾回收

2019-04-09 15:56:46

虛擬機內存區Java

2009-10-09 09:42:07

虛擬機內存

2012-08-13 10:19:03

IBMdW

2023-02-28 07:56:07

V8內存管理

2010-09-26 16:42:04

JVM內存組成JVM垃圾回收

2010-05-31 16:53:21

Java

2011-07-04 16:48:56

JAVA垃圾回收機制GC

2015-06-04 09:38:39

Java垃圾回收機

2011-06-28 12:39:34

Java垃圾回收

2019-09-27 09:13:55

Redis內存機制

2017-03-03 09:26:48

PHP垃圾回收機制

2017-08-17 15:40:08

大數據Python垃圾回收機制

2010-09-25 15:33:19

JVM垃圾回收

2010-10-13 10:24:38

垃圾回收機制JVMJava
點贊
收藏

51CTO技術棧公眾號

国产高清免费在线| 校园春色欧美| 亚洲韩日在线| 国产999精品久久久| 国产精品专区免费| 日韩欧美一级在线播放| 国产精品无码2021在线观看| 亚洲成人动漫av| 免费激情网址| 国产调教视频一区| 欧美国产日韩激情| 国产一区二区三区在线观看精品| 欧美亚洲爱爱另类综合| 亚洲人成人一区二区三区| 91久久爱成人| 红桃视频国产精品| 九九九久久久精品| 亚洲欧美日韩另类精品一区二区三区 | 最新av网址在线观看| 国产视频一区欧美| 国产综合第一页| 伊人久久成人| 九九99玖玖| 日韩高清电影一区| 丰满人妻一区二区三区53号| 床上的激情91.| 国产网站免费在线观看| 国产亚洲欧美日韩日本| 69久久久久久| 亚洲第一精品在线| 韩国三级在线观看久| 制服丝袜在线91| 亚洲欧洲日韩综合一区二区| 久久99中文字幕| 本田岬高潮一区二区三区| 最近免费中文字幕中文高清百度| 97久久夜色精品国产| 日韩中文字幕亚洲| 精品视频一二| 亚洲精品福利在线观看| 欧美老女人性开放| 国产拍欧美日韩视频二区| 欧美 日韩 国产 在线观看| 欧美日韩国产成人精品| 91精品成人久久| 色播在线观看| 在线观看亚洲精品| 免费男女羞羞的视频网站在线观看| 亚洲国产精品99久久| 欧美aaaaaaaa| 国产欧美在线看| 奇米精品一区二区三区在线观看一| 青青青青草视频| 亚洲一区二区三区四区五区黄 | 亚洲精品av在线| 9.1麻豆精品| 国产精品欧美一区二区| 日韩国产成人精品| 三年中国国语在线播放免费| 亚洲1区2区3区视频| 暖暖在线中文免费日本| 欧美日韩高清区| 99热在线精品观看| 色女孩综合影院| 免费亚洲一区二区| 韩国女主播成人在线观看| 老牛精品亚洲成av人片| 国产视频亚洲视频| 欧美日韩国产成人精品| 麻豆视频免费在线观看| 亚洲欧美精品在线| av毛片久久久久**hd| 欧美黄色一级| 一区二区不卡在线观看| 久热精品视频在线观看一区| 久久se精品一区二区| 欧美这里只有精品| 伊人精品在线观看| 中文字幕在线一区二区三区| 曰本人一级毛片免费完整视频| 性做久久久久久| 波多野结衣一区二区三区免费视频| 欧洲一区av| 久久蜜桃一区二区| 日本激情免费| 亚洲自拍中文字幕| 中文字幕av不卡| 欧美日韩美女| 亚洲国产精华液| 国产精品极品在线| 欧美videos中文字幕| 欧美日韩精品在线视频| 久久99精品国产91久久来源| 精品成人免费一区二区在线播放| 色综合av综合无码综合网站| 57pao成人国产永久免费| 欧美日韩在线视频一区| 在线播放成人| 中文字幕国内自拍| 一区二区xxx| 日韩小视频在线播放| av免费观看久久| 美女网站一区| 激情婷婷综合网| 国产精品久久7| 69**夜色精品国产69乱| 老司机午夜精品| 22288色视频在线观看| 成午夜精品一区二区三区软件| 成人性生交大合| 成人免费图片免费观看| 亚洲精品高清国产一线久久| 精品久久久久av影院| 精品一区免费av| 97在线超碰| 国产九九九九九| 中文字幕日本精品| 国产精品一卡二卡| 清纯唯美日韩| 国产日韩欧美a| 福利片在线一区二区| 成人午夜亚洲| 亚洲国产精品av| 99色在线观看| 中文字幕99| 视频一区视频二区国产精品| 国模精品一区二区三区色天香| 我不卡影院28| 免费黄网站在线播放| 国产资源在线播放| 日韩精品视频在线观看视频| 国产99在线免费| 国产精品日韩专区| 国产精品美女网站| 国产精品人成电影在线观看| 欧美成人午夜激情在线| 亚洲乱亚洲乱妇无码| 在线观看久久av| 亚洲自拍另类综合| 香蕉视频官网在线观看日本一区二区| 欧美aa在线| 91探花在线观看| 精品人人视频| xx欧美视频| 亚洲欧美小说色综合小说一区| a视频在线免费看| 国产高清一级毛片在线不卡| 国产天堂在线| 成人性爱视频在线观看| 中文字幕在线资源| 成人性生交大片免费看视频r| 天天视频天天爽| 九色在线网站| 成人jjav| 日本啊v在线| 欧美3p视频在线观看| 国产一区二区三区国产精品| 国产一区二区三区四区五区在线| 国产剧情一区在线| 欧美成人一区二区三区电影| 欧美一级二区| 蜜桃av色综合| 欧美人狂配大交3d怪物一区| 免费中文字幕日韩欧美| 成人video亚洲精品| 少妇特黄a一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 国产成人精品影视| 日本免费一区二区视频| 精产国产伦理一二三区| 日韩午夜电影在线观看| 亚洲精品小视频在线观看| 久久精品无码中文字幕| 久久手机精品视频| 自拍偷拍国产精品| 日韩精品二区| 国产精品剧情一区二区在线观看| 最新精品视频| 欧美精品久久久久| 午夜激情综合网| 丝袜亚洲精品中文字幕一区| 中韩乱幕日产无线码一区| 男捅女免费视频| 国产精品国产精品| 亚洲精品资源美女情侣酒店| 国产欧美精品日韩区二区麻豆天美| 日韩精品久久| 欧美人与牲禽动交com| 免费观看日韩毛片| 成人黄色av网站| 日韩黄色av网站| 一区二区三区成人| 免费人成精品欧美精品| 91九色鹿精品国产综合久久香蕉| 涩爱av在线播放一区二区| 国产福利片一区二区| 欧美精品久久久久| 欧美岛国在线观看| 一区二区三区产品免费精品久久75| 性xx色xx综合久久久xx|