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. js设计模式-观察者模式

    定义: 观察者模式又叫发布订阅模式,它定义了对象间的一种一对多的依赖关系.观察者模式让两个对象松耦合地联系在一起,虽然不太清楚彼此的细节,但这不影响他们之间的互相通信. 思路 定义一个对象,在对象中实 ...

  2. flex布局学习总结

    最近项目主要是小程序,小程序里面的布局主要采用flex布局,之前对flex 布局只是稍作了解,总结下flex 布局的常用套路 容器 Flex是Flexible Box的缩写,意为"弹性布局& ...

  3. 标签传播算法(Label Propagation)及Python实现

    众所周知,机器学习可以大体分为三大类:监督学习.非监督学习和半监督学习.监督学习可以认为是我们有非常多的labeled标注数据来train一个模型,期待这个模型能学习到数据的分布,以期对未来没有见到的 ...

  4. kill word out 1

    1● de 使~~ 成为 :离开 ,去掉,向下,变慢   2● dif 不,分开 ,否定,离开     3● deci 十分之一   4● deca 向下,离开   5● deca 十   6● di ...

  5. UVALive 5846 计数

    DES:给出任意两点之间连线的颜色.问一共会有多少个由相同颜色的边组成的三角形. 一共有C(3, n)个三角形.考虑一每个点为顶点的三角形.颜色不同的两条边组成的三角形一定不行.所以减去. 题目链接: ...

  6. svn: E200009: 'lib/systemd/system/dropbear@.service': a peg revision is not allowed here problem

    case: svn add lib/systemd/system/dropbear@.service svn: E200009: 'lib/systemd/system/dropbear@.servi ...

  7. TClientDataSet 的Filename 和 open方法

    cdsAdd.Open 不能用open,因为这个是DataSet的通用方法,不会检测文件名的,文件名是CDS特有的

  8. ESXi6.5中将虚拟机从厚置备转换为精简置备

    本文来自:https://blog.csdn.net/wangjingkaibear/article/details/77097041 用ESXi做虚拟化,创建了一个原始虚拟机并安装好系统做好基本设置 ...

  9. isKindOfClass in cocos2d-x

    在最新版2.*的cocos2d-x中isKindOfClass可以用如下代码代替. 未验证,不过看了引擎代码是这样写的   原代码 [s1 isKindOfClass:[DestHole class] ...

  10. Invalid /admin/*.jsp in filter mapping

    完成错误信息 严重: A child container failed during start java.util.concurrent.ExecutionException: org.apache ...