long 内存 java_Java内存模型

简述

Java内存模型(Java Memory Model,JMM),是用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现Java程序在各种 平台下都能达到一致的内存访问效果.

在JVM内部,Java内存模型把内存分成了两部分:线程栈区和堆区,下图展示了Java内存模型在JVM中的逻辑视图:

jvm_jmm2.png

JVM中运行的每个线程都拥有自己的线程栈,线程栈包含了当前线程执行的方法调用相关信息,我们也把它称作调用栈。随着代码的不断执行,调用栈会不断变化。

线程栈还包含了当前方法的所有本地变量信息。一个线程只能读取自己的线程栈,也就是说,线程中的本地变量对其它线程是不可见的。即使两个线程执行的是同一段代码,它们也会各自在自己的线程栈中创建本地变量,因此,每个线程中的本地变量都会有自己的版本。

所有原始类型(boolean,byte,short,char,int,long,float,double)的本地变量都直接保存在线程栈当中,对于它们的值各个线程之间都是独立的。对于原始类型的本地变量,一个线程可以传递一个副本给另一个线程,但它们之间是无法共享的。

堆区包含了Java应用创建的所有对象信息,不管对象是哪个线程创建的,其中的对象包括原始类型的封装类(如Byte、Integer、Long等等)。不管对象是属于一个成员变量还是方法中的本地变量,它都会被存储在堆区。

下图展示了调用栈和本地变量都存储在栈区,对象都存储在堆区:

jvm_jmm3.png

变量存储位置

1)一个本地变量如果是原始类型,那么它会被完全存储到栈区。

2)一个本地变量如果是一个对象的引用,引用变量会被存储到栈中,对象本身仍然存储在堆区。

3)一个对象的成员方法中包含的本地变量,仍需要存储在栈区,即使它们所属的对象在堆区。

4)一个对象的成员变量,不管它是原始类型还是包装类型,都会被存储到堆区。

5)Static类型的变量以及类本身相关信息都会随着类本身存储在堆区。

6)堆中的对象可以被多线程共享:

如果一个线程获得一个对象的引用,它便可访问这个对象的成员变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值