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. 30. Substring with Concatenation of All Words *HARD*

    You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...

  2. 一、final关键字

    final关键字修饰:类,方法,基本类型变量,引用,具有不同的意思 1.final修饰类 表示该类不能被继承 package property; public final class Hero ext ...

  3. OC 构造方法(对象初始化)

    一.构造方法 (一)构造方法的调用 完整的创建一个可用的对象:Person *p=[Person new]; New方法的内部会分别调用两个方法来完成2件事情,1)使用alloc方法来分配存储空间(返 ...

  4. @RunWith和 SpringJUnit4ClassRunner ---->junit4和Spring一起使用

    今天在看Spring的Demo的时候,看到了如此单元测试的写法 如下: @RunWIth(SpringJunit4ClassRunner.class) @ContextConfiguration(lo ...

  5. 若所有的参数皆需要类型转换——请为此采用non-member函数

    若所有的参数皆需要类型转换--请为此采用non-member函数 经常使用C++的程序猿(希望更多的程序媛),一般不会同意让classes支持类型转换,至于为什么,请看后续的博客.假如我们设计一个表示 ...

  6. python 安装 scapy windows 10 64bit

    简介: 前段时间装的pypcap做嗅探.打包受阻.因为我都是在windows做的.也要打包到exe给别人用. 所以尝试了一下scapy,也可以嗅探,貌似功能更强大.先用sniff吧. 这个也不是在ve ...

  7. 读书笔记 C# Lookup<TKey,TElement>和ToLookup方法的浅析

    Lookup<TKey,TElement>类型对象和分组是一样的,就好比使用Linq的group关键字后所查询出来的结果,使用foreach的时候,都可以用IGrouping<TKe ...

  8. Linux内核分析-分析Linux内核创建一个新进程的过程

    作者:江军 ID:fuchen1994 实验题目:分析Linux内核创建一个新进程的过程 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/li ...

  9. 06-python opencv 使用摄像头捕获视频并显示

    https://blog.csdn.net/huanglu_thu13/article/details/52337013

  10. Redmine开源项目管理搭建

    今年7月底,跳槽到新公司,新公司对于项目管理,也是从今年上半年开始有这个想法的.都是新同事,整个项目管理流程内部讨论决定如何制定. 刚入职时,对于项目需求的管理都是通过excel和project记录的 ...