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. dns 服务架构优化 - 百万级并发不是梦 - bind+namedmanager+dnsmasq

    bind: DNS服务端. namedmanager: DNS web管理页面. dnsmasq: 并发查询上游dns域名解析. 问题:作为消息推送业务,单台业务机器域名解析并发达到上万次.业务机器集 ...

  2. Intel DAAL AI加速——神经网络

    # file: neural_net_dense_batch.py #================================================================= ...

  3. en_java去重排序

    @Test public void tes5() { String[] strs ={"e", "ee", "ea", "ei&q ...

  4. CCF CSP 201703

    CCF CSP 2017·03 做了一段时间的CCF CSP试题,个人感觉是这样分布的 A.B题基本纯暴力可满分 B题留心数据范围 C题是个大模拟,留心即可 D题更倾向于图论?(个人做到的D题基本都是 ...

  5. 软工作业No.9 第六周 事后诸葛亮分析报告

    甜美女孩项目2048结果 整理:邓画月.曾祎祺 设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 弄一个给用户消磨时间的游戏,定义的很清楚.该游戏玩 ...

  6. L1-008 求整数段和

    给定两个整数A和B,输出从A到B的所有整数以及这些数的和. 输入格式: 输入在一行中给出2个整数A和B,其中−,其间以空格分隔. 输出格式: 首先顺序输出从A到B的所有整数,每5个数字占一行,每个数字 ...

  7. 玩转X-CTR100 l STM32F4 l DHT11温湿度传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] DHT11数字温湿度传感器是一款含有已校准数字信号输 ...

  8. JQ延迟对象

    延迟对象初识 技术一般水平有限,有什么错的地方,望大家指正. ES6已经实现了延迟对象Promise,但是今天主角是JQ里面的延迟对象,套路其实都是差不多的.下面先看一个比较牵强的例子: <bu ...

  9. php include,require 主要是向网页中引入文件

  10. CSS3之border-image

    先上效果图,类似于IPHONE手机左上角的返回按钮样式,如果是在CSS2那么就要做一张背景图片扩展就没那么灵活了,CSS3内就不需要了,CSS3样式挺强大方便的. 源图片: 样式: .banner { ...