Jav中堆内a与栈存存内
J
vaa堆内存与栈内存中配分浅 析
J
aav 内把存划分两种:一成种是栈内存另一种是,内堆存在。数函中定的一义基些类本型的量和对变的象引用量变是都在函的数栈存内分中配,在一当代段块定义一码个变量时J,aav 在就中栈这为个变量配内分空存,间当超变量的过用域后作,avJ 会自动a释掉为该放量分变配的内存空,间内该空间可存以立被另即它用。作
内堆用来存放存 由en 创w的对建和数象,组在堆中分配内的存,由 ava J拟机的自动垃圾回虚器收管来理在。堆中生产了个数一或者组象对后,还可以在之栈中义定一个特殊的变量,让栈的这个中变的量取值于数等或对象组堆在内中的存地址,首栈中的个这变量成了就数或组象对的用引量,变后以可就在程序中使用栈中以的用变引来量问访堆中的组或数对者,引象用量变相就当是于为数或组对象者的起个名称。引用变一是量通的普量,定变时义在栈中分,配用引量在变程序行运到作用域之外后被释其放。而数组和对本身在象堆中分,即使配程序运行使到 new用 产生组数者或象对语的所句在代的码之外,数块组和对象本占身的内存据不被会放,数组和释象在没对有引用变指向它量的候,时才变为垃,圾不在被能用使但,然仍占据存内间不放,在空后的一随个确不的定时间被圾回垃器收收(释放走掉) 。
这也 是Jaa比v占内较的存因原,际实上,栈中变量的向指堆存内中的量变,就这是Jav a的指针中
!
--------------------------------
- ajva中存分内策配及堆略栈的比较 和
1 内存 配策略 分
照编按译原的观理点程序运行,的时内存配分有种三策,略别是静态的分,栈的,和式堆式的.
静态
储存分是配指编译在就能时确每个定数据目标在行运刻时存储空的间需求因而,在编译就时以可他们给分固配的定存空间内这.分配策种要略程序代码中求允许不可变数据有结(比如构变数可)的组存在,不也允许嵌有或者套归递的构结出,现因为们都它会致编导译序程无计法算准确的存储间需空.求
栈式 存储分也配可为动态称储存配分,由是个类一于堆似的运栈栈行实现的来和静.态存分配相反,在储式栈存储案方,程序中对据数的区需求编在译是时完未知全的只,有到运行的时候才能知够道但是规定,运行中在入进个程一序模时块,须必知道程序模该所块需的数据大小区能够才其为配分内.和存我在数们据构所熟结知栈的样,一式栈储分存按配先进后照的出原进则分配行。
静存态储配分要求编译时在能道所知变有的量储要存,求栈存储式分配要求在程
过的入处口必须知道有所的储要存求,而式堆储存配则分专负责在编门译时运行时模或块入处口都法无定确储存求的要数结构的据存内分,配比可变如度串长对和象实.堆由例片大可利的块用或闲块空成,堆组中内的存可按以任照顺序分意和配放释 .
堆和栈2比的较
上面的定 义编从原理的教材中译总结而来除,静态储分存配之,外都得显很呆板难和以理,下解撇开静面存储态配分集中比,堆较栈:和
从 堆和栈的能功作用和通来俗的较,比堆主要用存放对象的,栈来要是主来用行程序的.执这而不种又主要是由同于堆栈的和特决点定: 的
在
程编中例,如/CC+中+所,有方法的调都是用通栈过来行进的所,的局部变有,形量式参都是数从中分配栈内存间的空。际上也不是实什分么,只配从是顶向栈用上就,就行好像厂中的工传带送c(ovenory ble)一样t,Satkc Poniter会动自引指到放东西的你置位你,要所做的是只东把西下放来就.行退函出的数时候,修改指栈就针可以把栈中的内销毁容.样的模式这速度快最 ,然当要来用运行程序了.需要意注的,是分在配的候,时如比为个一即将要用调程序的模块分配数据区,应事时先道知这个数区的据大,小就说是也然虽分是配在程运行序进行的,但时分配的是小大少多确定是的,不变的而这,"个大多少"是在编小译确时定的,不在是运行. 时
堆是 用程应在运行序的时请候求作系操分统配自己内存,由于从给作操统系管的理内分配,所存以在分和销毁配都时要占用时间,此因用的效堆非率常.低是堆的优点但于在编译,器必不道要知堆从里分多少存储配空,间也不必知存储道数据要在的里停留堆多的长时间因,此,用保堆数存时据会到得更的灵大活性事实。,面上向象对的态多,堆性存分配内必是不可少,的为因多变量态需所存的储空只有间运行时创在了建象对之后才能确定.C++中,要在创建一个对象求,只时用 需ewn令编命制关相的代码即。执行这可些代时,会在码堆自里动进数据的保行.当存,然达到为种灵活这性,必然会付一定出的代:在价堆里分存储空间配会时掉更花的长时!这间也正是导致我刚们才说所效率的低原的因看,列宁同来说志好的,的人优往往也是人的点缺点,人的缺点往也往人的是优点.
3 JV
M中的堆和 栈
VJ是M于堆栈的基拟虚.J机VM每个新为创的线程都建配一分堆个.栈就也说,对于是一Ja个v程a来说,序的它行就是通运对过堆栈的操来作成的完堆栈以帧为单位保存线。程状的。态JMV堆栈只进行两种操对:以作帧为位的单压和出栈栈作。 操
我们 道,知某个线程在执行正方法的称为线此程当前的方法我.们可能
不知,道前方法当使的帧用为当称帧前。当程激线一个Jav活方a,JVM就法会线程的在J aav栈堆新压里入个帧一这。个自帧成为了然当帧.在前此法执方期间,这行帧将个来用保参存,局数变量,中间部计算程和其过他数据.这个帧这在和编里原理中的活动译录的纪概念是不多差.的
从Jaav的种这分机配来看,制堆栈可以这又理样解堆栈(Stack:)操是系统在建作某个立程进时者线程(在支或持线程的多操系作统是中线程为这个线)程建立存的区域储该,域区具先进有出后的特性 。
每一个 Jaa应用都唯一对v应一个JM实V,例一个实每唯一对例应个一堆应。用程序运行在所中创建的所类有例或数组实都在这个堆放中,并应用所由有线的共享.程跟/C++不同CJ,vaa分中堆内配是存自动始化初。J的vaa所中有象对存的储间空是在都中分配堆的,但这个是对的引用象是却堆在中分配,也栈就是说在建立个一对象从两时个地都分方内配存,堆中分配在内的存际建立实个对象,而在堆这栈中配分内的存是一个指向只这个对堆的象针指引用() 已而。
Jav中堆内a与栈存存内
J
vaa堆内存与栈内存中配分浅 析
J
aav 内把存划分两种:一成种是栈内存另一种是,内堆存在。数函中定的一义基些类本型的量和对变的象引用量变是都在函的数栈存内分中配,在一当代段块定义一码个变量时J,aav 在就中栈这为个变量配内分空存,间当超变量的过用域后作,avJ 会自动a释掉为该放量分变配的内存空,间内该空间可存以立被另即它用。作
内堆用来存放存 由en 创w的对建和数象,组在堆中分配内的存,由 ava J拟机的自动垃圾回虚器收管来理在。堆中生产了个数一或者组象对后,还可以在之栈中义定一个特殊的变量,让栈的这个中变的量取值于数等或对象组堆在内中的存地址,首栈中的个这变量成了就数或组象对的用引量,变后以可就在程序中使用栈中以的用变引来量问访堆中的组或数对者,引象用量变相就当是于为数或组对象者的起个名称。引用变一是量通的普量,定变时义在栈中分,配用引量在变程序行运到作用域之外后被释其放。而数组和对本身在象堆中分,即使配程序运行使到 new用 产生组数者或象对语的所句在代的码之外,数块组和对象本占身的内存据不被会放,数组和释象在没对有引用变指向它量的候,时才变为垃,圾不在被能用使但,然仍占据存内间不放,在空后的一随个确不的定时间被圾回垃器收收(释放走掉) 。
这也 是Jaa比v占内较的存因原,际实上,栈中变量的向指堆存内中的量变,就这是Jav a的指针中
!
--------------------------------
- ajva中存分内策配及堆略栈的比较 和
1 内存 配策略 分
照编按译原的观理点程序运行,的时内存配分有种三策,略别是静态的分,栈的,和式堆式的.
静态
储存分是配指编译在就能时确每个定数据目标在行运刻时存储空的间需求因而,在编译就时以可他们给分固配的定存空间内这.分配策种要略程序代码中求允许不可变数据有结(比如构变数可)的组存在,不也允许嵌有或者套归递的构结出,现因为们都它会致编导译序程无计法算准确的存储间需空.求
栈式 存储分也配可为动态称储存配分,由是个类一于堆似的运栈栈行实现的来和静.态存分配相反,在储式栈存储案方,程序中对据数的区需求编在译是时完未知全的只,有到运行的时候才能知够道但是规定,运行中在入进个程一序模时块,须必知道程序模该所块需的数据大小区能够才其为配分内.和存我在数们据构所熟结知栈的样,一式栈储分存按配先进后照的出原进则分配行。
静存态储配分要求编译时在能道所知变有的量储要存,求栈存储式分配要求在程
过的入处口必须知道有所的储要存求,而式堆储存配则分专负责在编门译时运行时模或块入处口都法无定确储存求的要数结构的据存内分,配比可变如度串长对和象实.堆由例片大可利的块用或闲块空成,堆组中内的存可按以任照顺序分意和配放释 .
堆和栈2比的较
上面的定 义编从原理的教材中译总结而来除,静态储分存配之,外都得显很呆板难和以理,下解撇开静面存储态配分集中比,堆较栈:和
从 堆和栈的能功作用和通来俗的较,比堆主要用存放对象的,栈来要是主来用行程序的.执这而不种又主要是由同于堆栈的和特决点定: 的
在
程编中例,如/CC+中+所,有方法的调都是用通栈过来行进的所,的局部变有,形量式参都是数从中分配栈内存间的空。际上也不是实什分么,只配从是顶向栈用上就,就行好像厂中的工传带送c(ovenory ble)一样t,Satkc Poniter会动自引指到放东西的你置位你,要所做的是只东把西下放来就.行退函出的数时候,修改指栈就针可以把栈中的内销毁容.样的模式这速度快最 ,然当要来用运行程序了.需要意注的,是分在配的候,时如比为个一即将要用调程序的模块分配数据区,应事时先道知这个数区的据大,小就说是也然虽分是配在程运行序进行的,但时分配的是小大少多确定是的,不变的而这,"个大多少"是在编小译确时定的,不在是运行. 时
堆是 用程应在运行序的时请候求作系操分统配自己内存,由于从给作操统系管的理内分配,所存以在分和销毁配都时要占用时间,此因用的效堆非率常.低是堆的优点但于在编译,器必不道要知堆从里分多少存储配空,间也不必知存储道数据要在的里停留堆多的长时间因,此,用保堆数存时据会到得更的灵大活性事实。,面上向象对的态多,堆性存分配内必是不可少,的为因多变量态需所存的储空只有间运行时创在了建象对之后才能确定.C++中,要在创建一个对象求,只时用 需ewn令编命制关相的代码即。执行这可些代时,会在码堆自里动进数据的保行.当存,然达到为种灵活这性,必然会付一定出的代:在价堆里分存储空间配会时掉更花的长时!这间也正是导致我刚们才说所效率的低原的因看,列宁同来说志好的,的人优往往也是人的点缺点,人的缺点往也往人的是优点.
3 JV
M中的堆和 栈
VJ是M于堆栈的基拟虚.J机VM每个新为创的线程都建配一分堆个.栈就也说,对于是一Ja个v程a来说,序的它行就是通运对过堆栈的操来作成的完堆栈以帧为单位保存线。程状的。态JMV堆栈只进行两种操对:以作帧为位的单压和出栈栈作。 操
我们 道,知某个线程在执行正方法的称为线此程当前的方法我.们可能
不知,道前方法当使的帧用为当称帧前。当程激线一个Jav活方a,JVM就法会线程的在J aav栈堆新压里入个帧一这。个自帧成为了然当帧.在前此法执方期间,这行帧将个来用保参存,局数变量,中间部计算程和其过他数据.这个帧这在和编里原理中的活动译录的纪概念是不多差.的
从Jaav的种这分机配来看,制堆栈可以这又理样解堆栈(Stack:)操是系统在建作某个立程进时者线程(在支或持线程的多操系作统是中线程为这个线)程建立存的区域储该,域区具先进有出后的特性 。
每一个 Jaa应用都唯一对v应一个JM实V,例一个实每唯一对例应个一堆应。用程序运行在所中创建的所类有例或数组实都在这个堆放中,并应用所由有线的共享.程跟/C++不同CJ,vaa分中堆内配是存自动始化初。J的vaa所中有象对存的储间空是在都中分配堆的,但这个是对的引用象是却堆在中分配,也栈就是说在建立个一对象从两时个地都分方内配存,堆中分配在内的存际建立实个对象,而在堆这栈中配分内的存是一个指向只这个对堆的象针指引用() 已而。