Java内存模型JMM

Java内存模型(即Java Memory Model简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式

JMM中的主内存和工作内存

1、JMM中的主内存

存储Java实例对象。

包括成员变量,类信息,常量,静态变量等

属于数据共享的区域,多线程并发操作时会引发线程安全问题。

2、Java中的工作内存

存储当前方法的所有本地变量信息,本地变量对其他线程不可见

字节码行号指示器、Native方法信息

属于线程私有数据区域,不存在线程安全问题。

JMM与Java内存区域划分是不同的概念层次

JMM描述的是一组规则,围绕原子性,有序性和可见性展开。

相似点:存在共享区域和私有区域

JMM Java内存区域划分
主内存 堆和方法区
工作内存  程序计数器,虚拟机栈,本地方法栈

  

JMM中的主内存和工作内存的数据存储类型以及操作方法

方法里的基本数据类型本地变量将直接存储在工作内存的栈桢结构中

引用类型的本地变量: 引用存储在工作内存中,实例存储在主内存中

成员变量,static变量,类信息均会被存储在主内存中

主内存共享的方式是线程各拷贝一份数据到工作内存,操作完成后刷新回主内存。

1、Java类

public class Math {

    public  static  final Integer CONSTANT = 666;

    public  int math(){
int a = 1;
int b = 2;
int c = (a+b) * 10;
return c;
} public static void main(String[] args) {
Math math = new Math();
math.math();
}
}

  生成字节码文件  javac Math.java

2、反汇编字节码文件   javap -c Main.class

程序计数器: 程序要执行的下一行地址指针,线程独有。

操作数栈: 数据中转内存

动态链接:

方法出口:

方法区: JDK8之前叫永久代,JDK8之后叫元空间。存放静态变量+常量+类元信息(Math.class类元信息)

本地方法:

本地方法栈:

堆结构

内存溢出 OOM

Java 内存模型学习笔记的更多相关文章

  1. Java内存模型学习笔记

    Java内存模型(JMM):描述了java程序中各种变量(线程共享变量)的范根规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节.共享变量就是指一个线程中的变量在其他线程中也是可见 ...

  2. java 内存模型 ——学习笔记

    一.Java 内存模型 java内存模型把 Java 虚拟机内部划分为线程栈和堆 下面这张图演示了调用栈和本地变量存放在线程栈上,对象存放在堆上.      ==>>  一个局部变量可能是 ...

  3. Java内存模型学习笔记(一)—— 基础

    1.并发编程模型的分类 在并发编程中,我们需要处理两个关键的问题:1.线程间如何通信,2.线程间如何同步.通信是指线程之间以何种机制来交换信息,同步是指程序用于不同线程之间操作发生相对顺序的机制. 在 ...

  4. 《Java并发编程实战》第十六章 Java内存模型 读书笔记

    Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...

  5. 深入理解java内存模型--读书笔记

    深入理解java内存模型 java内存模型的抽象 java线程之间的通信由java内存模型(JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见 从抽象的角度来看,JMM决定了线程和主 ...

  6. 2016021801 - Java内存区域学习笔记

    根据<深入理解java虚拟机>学习归纳整理学习笔记 程序计数器 用途:当前线程的字节码文件的行号指示器.(当前机场负责控制飞机降落的空管员:当前线程表示当前机场, 所执行的字节码等同于被等 ...

  7. java内存模型学习

    根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 虚拟机的内存模型分为两部分:一部分是线程共享的,包括 Java 堆和方法区:另一部分是线程私有的,包括虚拟 ...

  8. <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

  9. Java并发编程(1)-Java内存模型

    本文主要是学习Java内存模型的笔记以及加上自己的一些案例分享,如有错误之处请指出. 一 Java内存模型的基础 1.并发编程模型的两个问题 在并发编程中,需要了解并会处理这两个关键问题: 1.1.线 ...

随机推荐

  1. 【leetcode】513.Find Bottom Left Tree Value

    原题 Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / 1 ...

  2. Linux下安装php 扩展fileinfo

    在项目初始部署环境的时候,可能考虑的并不全面,就会少装一些扩展,这里讲解如何添加fileinfo扩展 1.找到php安装的压缩包 2.将压缩包cp到 /data目录下,并解压 cp php-7.0.3 ...

  3. android开机启动流程说明

    android开机启动流程说明 第一步:启动linux 1.Bootloader 2.Kernel 第二步android系统启动:入口为init.rc(system\core\rootdir) 1./ ...

  4. Android NDK 同时编译多个模块

    |-test |---Android.mk |---Application.mk |---sub1 |------Android.mk |------main.c |---sub2 |------An ...

  5. python返回值的缺省设置

    有时候并不需要返回所有的值,但是原始函数的return语句中又有较多参数时: 方法一:修改原始返回值,只返回需要的参数 方法二:如果原始函数时第三方库或者python自带库,则直接修改可能不太好,于是 ...

  6. Go语言中的数据格式(json、xml 、msgpack、protobuf)

    在分布式的系统中,因为涉及到数据的传输,所以一定会进行数据的交换,此时就要定义数据交换的格式,例如二进制.Json.Xml等等.本篇文章就是总结一下常用的几种数据格式. 一.Json格式 如果想使用J ...

  7. linux systemd 从简单的例子入门

    linux systemd 从简单的例子入门 网上很多相关链接,一上来就给一大堆命令和讲解,让人头都大. 我们希望有一个service(服务),让它在开机启动的时候就执行. 用 root 登陆以后: ...

  8. 设置input 中placeholder的样式

    ::-webkit-input-placeholder { /* Chrome/Opera/Safari */ position: relative; top: 4px; } ::-moz-place ...

  9. Visual Studio Code IDE开发插件配置

    [PHP通用集成环境] PHP Extension Pack #PHP拓展包,PHP开发最重要的拓展 PHP Intelephense #PHP自动补全工具 PHP IntelliSense #PHP ...

  10. guava字符串工具 Splitter 主要功能是拆分字符串为集合 Map

    public class SplitterTest { public static void main(String args[]){ //1.拆分字符串为List集合 String str=&quo ...