JVM为什么要区分为栈和堆?
栈代表的操作逻辑存储,堆代表的是数据逻辑存储,这样来划分更加清晰;
JVM的内存在宏观上面来讲分为私有内存和共享内存;所谓共享内存(堆)寓意就是各个私有的栈(每个线程私有)可以通过引用来共享堆中的对象。这样的设计可以让各个线程共享一个对象;节省空间,另外可以实现逻辑语义中对一个公共数据的并行操作;
那么为什么原生类型(primary type)没有放在堆里面呢?因为primary type里面本身都是比较小,而且不会动态增长;存到“栈”(作为轻量级存储)就可以了,那么为什么对象不能放在栈里面?因为对象的大小是不可以预知的,这个是“堆”空间划分的物理意义(逻辑意义是操作和数据分离);
到此,堆和栈的涵义多少有点清晰了,轻量级的存储空间“栈”主要负责运算逻辑,包括方法参数,变量的引用地址(堆地址)等信息;重量级的存储空间“堆”主要负责“对象”的存储,对于对象数据的动态扩展给予了很好的支持。
所以要明白JVM核心是栈,而不是堆,因为如果没有堆,但是有栈,程序是可以运行(只要操作的不是对象);反过来JVM就没有运行逻辑可以存放了。所以堆其实是为了栈服务的。
这样,一个线程被拉起来执行代码,计数器能够只是当前代码行数,从内存中取出代码,然后线程执行类中方法,在方法去获取类以及常量信息,然后在线程的栈(JVM stack)中存放要执行函数的入口参数信息(即使是对象,参数信息也是“值”,只不过是“引用值”;如果代码体执行过程中发现需要创建类,则在堆中创建,在读取“值”的时候如果是原始类型,直接操作”值“即可,如果是“引用值”,则需要到堆中去进行处理。
 
最后,对于参数和对象的理解,在Java里面其实传递都是值(并没有传引用),要么是真”值“,要么是“引用值”,对于入口参数的处理两者是一样的,但是在真正处理参数的时候,程序将会知道这个“值”是“引用值”,那么就会到对应的”堆“空间中找到对应对象,然后进行后续操作;对象本质上其实是一棵“值”树,对象的叶子节点都是值类型。
 
参考:
JVM基础:深入学习JVM堆与JVM栈(这是我见过的行文最流畅的介绍JVM的文章)

JVM内存模型(二)的更多相关文章

  1. JVM内存模型二

    Java 中通过多线程机制使得多个任务同时执行处理,所有的线程共享JVM内存区域main memory,而每个线程又单独的有自己的工作内存,当线程与内存区域进行交互时,数据从主存拷贝到工作内存,进而交 ...

  2. JVM内存模型 二

    在并发编程中,多个线程之间采取什么机制进行通信(信息交换),什么机制进行数据的同步? 在Java语言中,采用的是共享内存模型来实现多线程之间的信息交换和数据同步的. 线程之间通过共享程序公共的状态,通 ...

  3. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  4. JVM初探 -JVM内存模型

    JVM初探 -JVM内存模型 标签 : JVM JVM是每个Java开发每天都会接触到的东西, 其相关知识也应该是每个人都要深入了解的. 但接触了很多人发现: 或了解片面或知识体系陈旧. 因此最近抽时 ...

  5. JVM内存模型和关键参数设置

    一. JVM内存模型: Jvm内存模型是学好Java很重要的一部分,该部分学习能让我们在系统运维的时候,或者优化服务器的时候能够有方法,懂原理. 二. Jvm关键参数: 1. 堆大小设置参数: -Xm ...

  6. 记录JVM内存模型,参数含义和优化

    一.JVM内存模型 (图片来自网络) 根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) Perm (永久代) 其中New和Tenured属于堆内存,堆内存会从J ...

  7. JVM的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集

    (转自:http://my.oschina.net/u/436879/blog/85478) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认 ...

  8. Java基础知识强化100:JVM 内存模型

    一. JVM内存模型总体架构图:  方法区和堆由所有线程共享,其他区域都是线程私有的 二. JVM内存模型的结构分析: 1. 类装载器(classLoader) 类装载器,它是在java虚拟机中用途是 ...

  9. JVM内存模型及内存分配过程

    一.JVM内存模型 JVM主要管理两种类型内存:堆(Heap)和非堆(Permanent区域). 1.Heap是运行时数据区域,所有类实例和数组的内存均从此处分配.Heap区分两大块,一块是 Youn ...

  10. JVM内存模型以及垃圾收集策略解析

    http://xmuzyq.iteye.com/blog/599750 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程. ...

随机推荐

  1. XML Publisher Using API’s(转)

    原文地址:XML Publisher Using API’s Applications Layer APIsThe applications layer of XML Publisher allows ...

  2. bind出现Address already in use解决方法

    在socket函数和bind函数之间加入一段代码: // 建立服务器端socket if((server_sockfd = socket(AF_INET, SOCK_STREAM, 0))<0) ...

  3. win7下安装node及出现的npm问题

    按照官网下载安装,选择 Windows Installer (.msi):,一直next安装,默认安装在C:\Program Files\nodejs下,环境变量会自动添加 如果安装后,打开cmd输入 ...

  4. 怎样设置IIS6.0的闲置超时时间

    打开IIS 信息服务管理器 1)打开IIS,点击应用程序池 2)找到Bs项目使用具体程序池(DspTest) 3)右键属性找到高级设置-- 进程模型 -- 闲置超时 4)设置闲置超时时间(默认为20分 ...

  5. 申请和使用github共享代码

    1.申请github帐号 https://github.com/join?source=header-home 2.创建项目 2.1 或者: 2.2 输入信息 2.3创建成功,地址及基本命令提示 3. ...

  6. Mysql/Mariadb 升级注意事项

    因需要使用到分区表,在业务不中断的情况下,可以新增分区,需要将原来的Mariadb10.1.25版本升级到Mariadb10.3.8. 1.升级步骤如下 1)新搭建Mariadb10.3.8版本的DB ...

  7. web项目中的路径问题

    “/”表示根路径 1.“/”代表的意思不是固定的,是要根据具体的方法,才能知道在该方法中"/"所代表的含义,同样相对路径也不是固定的,需要根据具体的方法来判断具体是相对哪个路径的相 ...

  8. Java——多线程常见面试题

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  9. jQuery的noConflict以及插件扩展

    一.noConflict函数 JavaScript有很多插件,如果jQuery对象的$与其他插件冲突,我们可以使用noConflict()方法去掉$或者使用其他的符号代替 注:noConflict() ...

  10. TV-B-Gone Kit - Universal v1.2