日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java动态扩展_java栈内存动态扩展要怎么理解?要如何实现?

發(fā)布時間:2023/12/2 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态扩展_java栈内存动态扩展要怎么理解?要如何实现? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

小伙伴們知道如何在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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。