JVM内存结&JVM内存模型

     今天就对Java中常见的几个概念理一理。什么JVM,什么java内存结构,什么JVM内存模型啥的,老是混淆,分不清他们,今天做一个简单的分享,可能总结的不好,有不足之处多指点指点。

JVM内存结构

 1. 首先说明明确一个概念, 经常所说的JVM内存结构实际是也就是Java内存结构。可以这样认为: Java内存结构 = JVM内存结构。

2. Java内存结构组成:

    1) 首先从这个图直观的来了解Java内存结构:

                                           

2) Java 堆

        Java 堆是JVM内存管理中最大的一块,是被所有线程共享的一块的内存区域。Java堆主要存放对象实例。 所有的对象实例和数组都在堆上分配。

3)Java栈

       Java虚拟机栈是每个线程私有的一块内存区域,它的生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈用于存储局部变量表、操作数栈、方法出口等消息

4)方法区

          方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它有个别命叫Non-Heap(非堆)。当方法区无法满足内存分配需求时,抛出OutOfMemoryError异常。

5)本地方法 

        本地方法栈与虚拟机栈所发挥作用非常相似,它们之间的区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的native方法服务。本地方法栈也是抛出两个异常。

JVM内存模型

      共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

                             

从上面这个图可以看出,两个线程之间进行通信要进过两个过程。

      1. 首先, 线程A把本地内存A中更新过的变量刷新到主内存中

      2. 线程B到主内存中去读取线程A之前已更新过的共享变量 

主要步骤用以下一个图来说明:

                    

如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。

总结:什么是Java内存模型:java内存模型简称jmm义了一个线程另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,多个线程同时访问一个数据的时候,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值