JAVA内存模型 VS JVM运行时数据区

JVM运行时数据区

jvm运行时内存

线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁
线程独占:每个线程都会有他独立的空间,随线程生命周期而创建和销毁

  • 线程共享部分又包含方法区堆内存

    方法区:用来存放类信息、常量、静态变量、编译后的代码等数据,虚拟机规范中这是一个逻辑划分,具体实现根据不同的虚拟机来实现。比如oracle的Hotspot虚拟机在java7中放在永久代,java8中放在元数据空间,且通过GC机制对这块区域进行管理。
    堆内存:用来存放对象,随JVM的启动而创建。又可细分为新生代(Eden、From Survivor、To Survivor)、老年代 。垃圾回收器主要管理的就是这块区域,如果满了会抛出OutOfMemeryError

  • 线程独占部分又包含虚拟机栈本地方法栈程序计数器

    虚拟机栈:每个线程都在这个空间有一个私有的空间。线程栈由多个栈帧组成。一个线程会执行一个或多个方法,一个方法对应一个栈帧。栈帧内容包含:局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。栈内存默认最大值是1M,超出则抛出StackOverflowError
    本地方法栈:作用于虚拟机栈一样,主要区别在于虚拟机栈用来执行java方法,本地方法栈是为虚拟机执行native方法准备的。同样,超出大小后会抛出StackOverflowError
    程序计数器:记录当前线程执行的字节码的位置,存储的是字节码指令地址,如果执行Native方法,则计数器值为空。
    每个线程都在这个空间有一个私有空间,占用的内存空间很少。
    CPU同一时间,只会执行一条线程中的指令。JVM多线程会轮流切换并分配,CPU执行时间的方式,为了线程切换后,需要通过程序计数器,来恢复正确的执行位置。

JAVA内存模型

java内存模型是由《JAVA语言规范》定义的,用来描述多线程程序语义执行的规则。它包含了多个线程修改了共享内存中的值,应该读取到哪个值的规则。其中的几个概念列举如下:

  • 原子性:原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其它线程干扰。
  • 有序性:是指在程序执行的时候,是按字节码指令顺序进行执行。
  • 可见性:可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。
  • Happen-Before规则:
    • 程序顺序原则:一个线程内保证语义的串行性
    • volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
    • 锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
    • 传递性:A先于B,B先于C,那么A必然先于C
    • 线程的start()方法先于他的每一个动作
    • 线程的所有操作先于线程的终结(Thread.join())
    • 线程的中断(interrupt())先于被中断线程的代码
    • 对象的构造函数执行结束先于finalize()方法

JAVA内存模型 VS JVM运行时数据区

在这里插入图片描述

Java内存模型是由《Java语言规范》定义的,用来描述多线程程序语义执行的规则
JVM运行时数据区是由《Java虚拟机规范》定义的,用来描述java虚拟机执行时内存的特点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值