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

转载 2016年08月29日 14:26:55

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的值。

jvm系列堆和栈的区别(一)

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内...
  • abasen
  • abasen
  • 2016年03月25日 18:00
  • 1001

Java千百问_07JVM架构(006)_java堆和栈有什么区别

在《jvm是如何管理内存的》这篇文章中,已经对PC寄存器(计数器 pc registers)、方法区(method area)、本地方法栈(native method stacks)、栈(stacks...
  • ooppookid
  • ooppookid
  • 2016年05月22日 12:09
  • 4628

Java堆和栈的区别(JVM运行时数据区域)

程序计数器:可以看做当前线程运行所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是 通过改变这个计数器的值来选取下一条需要执行的字节码指令。由于JVM多线程是通过线程轮流切换...
  • haiyoung
  • haiyoung
  • 2016年10月19日 19:57
  • 1120

java中堆和栈有什么区别

1) 在java中,堆和栈都是内存中存放数据的地方。变量分为基本数据类型和引用类型,基本数据类型的变量(例如 int  ,short, long, byte, char , boolean, floa...
  • JohnLee_chun
  • JohnLee_chun
  • 2016年09月16日 14:05
  • 1369

java内存模型,java内存管理,java堆和栈,垃圾回收

本来打算自己写个总结,但是看了一篇文章后,自觉很难超出其文,就直接copy过来啦 ,然后本地写了大概笔记,算是了解 摘自 http://www.cnblogs.com/hnrainll/archiv...
  • xubo_ob
  • xubo_ob
  • 2016年03月10日 23:10
  • 1666

架构师面试之-------谈谈jvm中堆和栈的区别

http://nannan408.iteye.com/blog/2311772
  • u013322876
  • u013322876
  • 2016年10月06日 20:23
  • 399

举例讲解JAVA中的堆和栈

Java中堆和堆栈的区别     1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 (降低内...
  • lifuxiangcaohui
  • lifuxiangcaohui
  • 2014年05月03日 22:20
  • 1291

jvm中的堆和栈

jvm是基于堆栈的虚拟机,堆和栈都是java中用来存储数据的地方. (1)堆的特点:        每个java应用进程(一个main线程以及它的子线程)对应一个堆,堆的大小可以通过参数-xm...
  • u010897406
  • u010897406
  • 2015年11月17日 21:51
  • 1031

JVM的堆和栈以及GC算法的介绍

JVM就是java虚拟机,我们可以把它理解成一个操作系统,每个不同的平台都有不同的JVM,比如linux系统和windows系统,就是因为这个原因所以java程序就有了一个很突出的特性就是 跨平台性其...
  • qq_20641565
  • qq_20641565
  • 2017年03月04日 17:17
  • 1822

面试题-堆和栈

转载: http://blog.csdn.net/hguisu/article/details/7369936 堆和栈的区别
  • xingyuan1hao
  • xingyuan1hao
  • 2016年04月23日 21:12
  • 551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM架构(006)_java堆和栈有什么区别
举报原因:
原因补充:

(最多只允许输入30个字)