关闭

JVM架构(006)_java堆和栈有什么区别

78人阅读 评论(0) 收藏 举报
分类:

1、java堆和栈有什么区别

了解jvm内存管理看这里:jvm是如何管理内存的 
《jvm是如何管理内存的》这篇文章中,已经对PC寄存器(计数器 pc registers)、方法区(method area)、本地方法栈(native method stacks)、(stacks)、(heap)内存区域做了介绍,其中栈(stacks)、堆(heap)是java内存管理中非常重要的两个部分,具体区别如下:

这里写图片描述

2、基本数据类型储存在栈中吗

基本数据类型由于长度固定,且需要空间比较少,所以直接存储在中(String是一个特殊的类型,它的值存储在堆中,但是通过池达到和栈类似的存取速度,具体看这里:String在内存中如何存放)。而对象比较大,所以栈中只存储一个4btye的引用地址(逻辑地址)。

实例:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> ;
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span> ;</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

分析如下:

  1. 编译器先处理int a = 3;首先它会在中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。

  2. 接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。

  3. 这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向它。因此a值的改变不会影响到b的值。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:24869次
    • 积分:599
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:96篇
    • 译文:0篇
    • 评论:0条
    博客专栏