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. ORACLE中使用DBMS_SQL获取动态SQL执行结果中的列名和值

    1.获取动态SQL中的列名及类型 DECLARE l_curid INTEGER; l_cnt NUMBER; l_desctab dbms_sql.desc_tab; l_sqltext ); BE ...

  2. transition多个属性同时渐变(width,height,background)

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  3. java学习笔记 --- 集合(续)

    1.map集合 1.1.特点:将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 1.2.Map集合和Collection集合的区别? Map集合存储元素是成对出现的,Map集 ...

  4. iOS 9 通用链接(Universal Links)

    什么是Universal Links? 在iOS9之前,对于从各种从浏览器.Safari中唤醒APP的需求,我们通常只能使用scheme.但是这种方式需要提前判断系统中是否安装了能够响应此scheme ...

  5. DevExpress WPF入门指南:绑定编辑器对话框

    绑定编辑器对话框 每个Smart Tag属性既可以设置也可以绑定.如下图所示,点击绑定按钮打开绑定对话框: 如果属性已经绑定,binging按钮会显示为黄色,绑定的文本会显示在相应的属性行. 绑定So ...

  6. 动态链接库DLL_第1篇

    动态链接库通常不能直接运行,也不能接收消息.它们是一些独立的文件,其中包含能被可执行程序或其他DLL调用来完成某项工作的函数.只有在其他模块调用动态链接库中的函数时,它才发挥作用.实际编程时,可把完成 ...

  7. mysql|中主外键关系(转)

    http://my.oschina.net/liting/blog/356150 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标 ...

  8. maven多环境配置

    我们在开发项目的时候,往往会有好几个环境.比如开发.预发布(测试).产品,每个环境一般用到配置都不一样,最典型的就是数据库,开发的数据库与产品的数据库肯定是不一样的,如果要多个环境的切换就得改配置,这 ...

  9. Eclipse js报错问题解决办法

    最近在Eclipse中导入新项目后会发现js报错,但是不影响程序的运行,但是对于程序员的我们来说多少还是比较在意代码前面的红色的X的,有木有??? 上网也查了很多方法,对于其中一种方法表示不能完全解决 ...

  10. 组件的 keep-alive 简介

    本篇文章,我们来讲一下keep-alive的实现.  更容易看懂 Vue中,有三个内置的抽象组件,分别是keep-alive.transition和transition-group, 它们都有一个共同 ...