java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?
小伙伴們知道如何在java棧中內(nèi)存動態(tài)擴(kuò)展嗎?這是虛擬機(jī)中的一個概念,下面讓我們一起來看看該如何實現(xiàn)吧。
一、內(nèi)存概念
在java中,我們一般會簡單把java內(nèi)存區(qū)域劃為兩種:堆內(nèi)存與棧內(nèi)存。其實這種劃分是比較粗粒度的。其中棧內(nèi)存就是指的是虛擬機(jī)棧,堆內(nèi)存指java堆。
棧內(nèi)存
實際為虛擬機(jī)棧。Java中每個方法被執(zhí)行時都會同時創(chuàng)建一個棧幀,它會被用來存儲局部變量、操作棧,動態(tài)鏈接,方法出口等信息。它的局部變量會包括各種基本類型的變量及對象的引用變量,且它們都是在方法的棧內(nèi)存中分配。java局部變量所需內(nèi)存空間一定是在編譯期間完成的,當(dāng)它進(jìn)入一個方法時,這個方法所需的局部變量空間就已經(jīng)確定,在方法運(yùn)行期間一定不會改變。當(dāng)在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內(nèi)存空間,當(dāng)超過變量的作用域后,java會自動釋放掉為該變量分配的內(nèi)存空間,該內(nèi)存空間就能夠立刻被另作他用。當(dāng)線程請求的棧深度大于虛擬機(jī)所允許的深度,則拋出StackOverflowError異常。當(dāng)虛擬機(jī)棧無法擴(kuò)展時候則拋出OutOfMemoryError異常。
堆內(nèi)存
堆內(nèi)存唯一目的就是new出對象實例,它會在虛擬機(jī)啟動時創(chuàng)建。它全部的對象實例與數(shù)組都需在堆上分配。堆是由垃圾回收負(fù)責(zé)的,所以也稱為“GC堆”,垃圾回收采用的分代算法,堆因此分為新生代與老年代。堆的優(yōu)勢是可以動態(tài)地分配內(nèi)存大小,生存期也不用事先告訴編譯器,因為它是在運(yùn)行時動態(tài)分配內(nèi)存的,Java的垃圾收集器會自動收走這些不再使用的數(shù)據(jù)。但它有缺點(diǎn),由于要在運(yùn)行時動態(tài)分配內(nèi)存,存取速度會較慢。
二、內(nèi)存實現(xiàn)
動態(tài)擴(kuò)展就是在??臻g不夠的時候,自動加大棧的空間,避免StackOverflow異常,JVM是沒有實現(xiàn)這個功能的。
動態(tài)棧一般有兩種方法:Segmented stack和Stack copying:
Segmented stack
它可以這么理解,當(dāng)一個雙向鏈表把多個棧連接起來,它一開始只分配一個棧,當(dāng)這個棧的空間不夠時,就再分配一個,用鏈表一個一個連起來。
Stack copying
作用為在棧不夠時,分配一個更大的棧,再把原來的棧復(fù)制過去。
使用函數(shù)alloca可以實現(xiàn)在棧上動態(tài)分配內(nèi)存:The
function?alloca?has?the?same?calling?sequence?as?malloc;
however,?instead
of?allocating?memory?from?the?heap,?the?memory?is?allocated?from?the?stack?frame?of?the?current
function.The?advantage?is?that?we?don?'t?have?to?free?the?space;
it?goes?away?automatically?when?the
function?returns.The?alloca
function
increases?the?size?of?the?stack?frame.The?disadvantage?is?that?some?systems
can?'t?support?alloca,?if?it'
s?impossible?to?increase?the?size?of?the?stack?frame
after?the
function?has?been?called.Nevertheless,?many?software?packages?use?it
,?and?implementations?exist
for?a?wide?variety?of?systems.
一般只支持Linux類型系統(tǒng)。#include
void?*alloca(size_t?size);
以上就是關(guān)于java棧內(nèi)存動態(tài)擴(kuò)展的所以內(nèi)容了,更多相關(guān)java入門知識,可以來我們的網(wǎng)站來了解詳情噢。
推薦閱讀:
總結(jié)
以上是生活随笔為你收集整理的java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7旗舰版怎么设置开机密码?(win
- 下一篇: java 反射 属性顺序_java反射得