zoukankan      html  css  js  c++  java
  • java内存模型

    1.java内存模型是什么?

    java内存模型即Java Memory Model,简称JMM,其规范了Java虚拟机与计算机内存时如何协同工作的,规定了一个线程如何和何时看到其他线程修改过的值,以及在必须时,如何同步访问共享变量。

    2.JVM的内存分配

    在解释Java内存模型之前,我们先了解下JVM的内存分配的几个概念,如下图所示,Java内存模型把内存分为两大块,一个是堆一个是栈。

    • 堆heap:运行时的数据区,由垃圾回收负责,动态分配大小。存取速度较慢;
    • 栈stack:存取速度比堆快,仅次于寄存器,数据可以共享,大小和生存期等是固定的

    3 java内存模型的抽象结构

    接下来我们从抽象角度看看线程和主存之间的抽象关系:

    线程之间的共享变量存储在主内存里,每个线程都有个私有的本地内存,存储了该线程以读/写共享变量的副本。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器优化。本地内存是JMM的一个抽象概念,并不真实存在。

    从上图来看,如果线程A与线程B之间要通信的话,必须要经历下面2个步骤。
    1)线程A把本地内存A中更新过的共享变量刷新到主内存中去。
    2)线程B到主内存中去读取线程A之前已更新过的共享变量。

    本地内存A和本地内存B由主内存中共享变量x的副本。假设初始时,这3个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内

    存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。
    从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为Java程序员提供内存可见性保证。

    4 递归操作与栈帧

     

     

    5 JVM分类

    6 java内存模型

    合理的内存模型可以使GC的性能更加强大,不必太大的浪费服务器的性能,从而减少阻塞所带来的程序的性能影响。

    例: 你现在收拾屋子 ,基本 上我们会有两类收拾方法:方式一: 简单的进行物品的码放以及打扫卫生, 时间短;

    上方式二:房屋装修与改造,时间长。Java中数据保存的内存位置:堆内存(调优、原理)

    最需要强调的就是JDK 1.8之后所带来的内存结构改变从及Gc策略提升;

     

  • 相关阅读:
    mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案
    WebAPI 用户认证防篡改实现HMAC(二)签名验证 AbsBaseAuthenticationAttribute--转
    Calling a Web API From a .NET Client (C#)
    http状态码有那些?分别代表是什么意思
    html 之表单,div标签等。。。。。。。
    mysql之视图,触发器,事务等。。。
    pymysql模块
    MySQL之IDE工具介绍及数据备份
    mysql老是停止运行该怎么解决
    前端基础之html
  • 原文地址:https://www.cnblogs.com/jingjinggood/p/12245145.html
Copyright © 2011-2022 走看看