zoukankan      html  css  js  c++  java
  • Java 内存模型学习笔记

    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

  • 相关阅读:
    nginx:配置详细说明
    linux:/etc/rc.local 不能自动启动问题
    nginx:403 forbidden 二种原因
    nginx:虚拟主机配置
    linux:lnmp环境搭建
    php:mysqli扩展
    linux:磁盘的分割、检验、格式化与挂载
    webpack
    js的window.onscroll事件兼容各大浏览器
    js window事件解析(转载)
  • 原文地址:https://www.cnblogs.com/linlf03/p/10806123.html
Copyright © 2011-2022 走看看