java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?
小伙伴們知道如何在java棧中內存動態擴展嗎?這是虛擬機中的一個概念,下面讓我們一起來看看該如何實現吧。
一、內存概念
在java中,我們一般會簡單把java內存區域劃為兩種:堆內存與棧內存。其實這種劃分是比較粗粒度的。其中棧內存就是指的是虛擬機棧,堆內存指java堆。
棧內存
實際為虛擬機棧。Java中每個方法被執行時都會同時創建一個棧幀,它會被用來存儲局部變量、操作棧,動態鏈接,方法出口等信息。它的局部變量會包括各種基本類型的變量及對象的引用變量,且它們都是在方法的棧內存中分配。java局部變量所需內存空間一定是在編譯期間完成的,當它進入一個方法時,這個方法所需的局部變量空間就已經確定,在方法運行期間一定不會改變。當在一段代碼塊中定義一個變量時,java就在棧中為這個變量分配內存空間,當超過變量的作用域后,java會自動釋放掉為該變量分配的內存空間,該內存空間就能夠立刻被另作他用。當線程請求的棧深度大于虛擬機所允許的深度,則拋出StackOverflowError異常。當虛擬機棧無法擴展時候則拋出OutOfMemoryError異常。
堆內存
堆內存唯一目的就是new出對象實例,它會在虛擬機啟動時創建。它全部的對象實例與數組都需在堆上分配。堆是由垃圾回收負責的,所以也稱為“GC堆”,垃圾回收采用的分代算法,堆因此分為新生代與老年代。堆的優勢是可以動態地分配內存大小,生存期也不用事先告訴編譯器,因為它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。但它有缺點,由于要在運行時動態分配內存,存取速度會較慢。
二、內存實現
動態擴展就是在棧空間不夠的時候,自動加大棧的空間,避免StackOverflow異常,JVM是沒有實現這個功能的。
動態棧一般有兩種方法:Segmented stack和Stack copying:
Segmented stack
它可以這么理解,當一個雙向鏈表把多個棧連接起來,它一開始只分配一個棧,當這個棧的空間不夠時,就再分配一個,用鏈表一個一個連起來。
Stack copying
作用為在棧不夠時,分配一個更大的棧,再把原來的棧復制過去。
使用函數alloca可以實現在棧上動態分配內存: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類型系統。#include
void?*alloca(size_t?size);
以上就是關于java棧內存動態擴展的所以內容了,更多相關java入門知識,可以來我們的網站來了解詳情噢。
推薦閱讀:
總結
以上是生活随笔為你收集整理的java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win7旗舰版怎么设置开机密码?(win
- 下一篇: java 反射 属性顺序_java反射得