精华内容
下载资源
问答
  • https://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html https://blog.csdn.net/javazejian/article/details/72772461
    展开全文
  • Java内存模型 Java内存结构的区别? Java内存模型: java内存模型指的是共享内存模型. 简称JMM. Java内存结构: 是指: 堆, 栈 , 方法区. JMM决定了一个线程对共享变量写入时,能对另一个线程可见. 从抽象的角度来说,...

    Java内存模型 和 Java内存结构的区别?

    Java内存模型: java内存模型指的是共享内存模型. 简称JMM.
    Java内存结构: 是指: 堆, 栈 , 方法区.

    JMM决定了一个线程对共享变量写入时,能对另一个线程可见. 从抽象的角度来说,JMM定义了线程与主内存之间的抽象关系;线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。当本地内存中的变量发生变化后,会先更新自己本地内存,然后在更新主内存. 这样就保证数据的可见性,但不保证原子性. 本地内存与主内存之间是实时更新的.
    本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。

    在这里插入图片描述
    从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤:

    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。
      从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。
      总结:什么是Java内存模型:java内存模型简称jmm,定义了一个线程对另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据的时候,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。
    展开全文
  • java内存模型和内存结构 总览 许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改。 JIT本身可以发挥作用。 为什么不同...

    java内存模型和内存结构

    总览

    许多多线程代码开发人员都熟悉这样的想法,即不同的线程可以对持有的值有不同的看法,这不是唯一的原因,即如果线程不安全,它可能不会看到更改。 JIT本身可以发挥作用。

    为什么不同的线程看到不同的值?

    当您有多个线程时,它们将尝试例如通过尝试访问同一内存来最小化它们将交互的数量。 为此,他们有一个单独的

    本地副本,例如在1级缓存中。 该缓存通常最终是一致的。 我已经看到了两个线程看到不同值的短时间,范围在1微秒到10毫秒之间。 最终,线程被上下文切换,缓存被清除或更新。 无法保证何时会发生这种情况,但是几乎总是不到一秒钟。

    JIT如何发挥作用?

    Java内存模型表示无法保证不是线程安全的字段将看到更新。 这允许JIT进行优化,将仅读取而不写入的值有效地内联到代码中。 这意味着即使更新了缓存,更改也可能不会反映在代码中。

    一个例子

    该代码将一直运行,直到将布尔值设置为false为止。

    >static class MyTask implements Runnable {
        private final int loopTimes;
        private boolean running = true;
        boolean stopped = false;
    
        public MyTask(int loopTimes) {
            this.loopTimes = loopTimes;
        }
    
        @Override
        public void run() {
            try {
                while (running) {
                    longCalculation();
                }
            } finally {
                stopped = true;
            }
        }
    
        private void longCalculation() {
            for (int i = 1; i < loopTimes; i++)
                if (Math.log10(i) < 0)
                    throw new AssertionError();
        }
    }
    
    public static void main(String... args) throws InterruptedException {
        int loopTimes = Integer.parseInt(args[0]);
        MyTask task = new MyTask(loopTimes);
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
        TimeUnit.MILLISECONDS.sleep(100);
        task.running = false;
        for (int i = 0; i < 200; i++) {
            TimeUnit.MILLISECONDS.sleep(500);
            System.out.println("stopped = " + task.stopped);
            if (task.stopped)
                break;
        }
    }

    该代码反复执行一些对内存没有影响的工作。 唯一的区别是需要多长时间。 通过花费更长的时间,它将确定在运行之前或之后将run()中的代码优化为false。

    如果我用10或100和-XX:+ PrintCompilation来运行,我会看到

    111    1     java.lang.String::hashCode (55 bytes)
    112    2     java.lang.String::charAt (29 bytes)
    135    3     vanilla.java.perfeg.threads.OptimisationMain$MyTask :longCalculation (35 bytes)
    204    1 % ! vanilla.java.perfeg.threads.OptimisationMain$MyTask :run @ 0 (31 bytes)
    stopped = false
    stopped = false
    stopped = false
    stopped = false
    ... many deleted ...
    stopped = false
    stopped = false
    stopped = false
    stopped = false
    stopped = false

    如果我用1000运行它,您会看到run()尚未编译并且线程停止

    112    1     java.lang.String::hashCode (55 bytes)
    112    2     java.lang.String::charAt (29 bytes)
    133    3     vanilla.java.perfeg.threads.OptimisationMain $MyTask::longCalculation (35 bytes)
    135    1 %   vanilla.java.perfeg.threads.OptimisationMain $MyTask::longCalculation @ 2 (35 bytes)
    stopped = true

    一旦线程被编译,即使线程将进行多次上下文切换等,也永远不会看到更改。

    如何解决这个问题

    简单的解决方案是使该字段易变。 这将确保该字段的值是一致的,而不仅仅是最终一致,这可能是缓存可能为您执行的操作。

    结论

    虽然有很多类似的问题示例; 为什么我的线程没有停止? 答案更多与Java内存模型有关,Java内存模型允许JIT“内联”它执行硬件的字段,并在不同的缓存中具有多个数据副本。

    参考: Vanilla Java博客上的JCG合作伙伴 Peter Lawrey提供的Java内存模型和优化

    翻译自: https://www.javacodegeeks.com/2013/01/java-memory-model-and-optimisation-2.html

    java内存模型和内存结构

    展开全文
  • JAVA内存结构和JAVA内存模型

    千次阅读 2018-01-18 12:01:43
    JAVA内存结构:堆、栈、方法区; 堆:存放所有 new出来的东西(堆空间是所有线程共享,虚拟机气动的时候建立);栈:存放局部变量(线程创建的时候 被创建);方法区:被虚拟机加载的类信息、常量、静态常量等。 类...

    JAVA内存结构:堆、栈、方法区;

    堆:存放所有 new出来的东西(堆空间是所有线程共享,虚拟机气动的时候建立);栈:存放局部变量(线程创建的时候 被创建);方法区:被虚拟机加载的类信息、常量、静态常量等。

    类加载系统:负责从文件系统或者网络加载class信息,加载的信息存放在方法区。   直接内存:JAVAnio库允许JAVA程序直接内存,从而提高性能,通常直接内存性能高于JAVA堆。读写频繁的场合可能会考虑使用。   本地方法栈:本地方法栈和JAVA栈类似,最大的不同为本地方法栈用于本地方法调用。JAVA虚拟机允许JAVA直接调用本地方法。    垃圾回收系统:是JAVA的核心。       pc寄存器:每个线程私有的空间。JAVA虚拟机为每个线程创建pc寄存器,在任意时刻一个JAVA线程总是在执行一个方法,这个方法被称为当前方法,如果当前方法不是本地方法,pc寄存器总会执行当前正在被执行的指令,如果是本地方法,则pc寄存器值为underfined,寄存器存放当前执行执行环境指针、程序技术器、操作栈指针、计算的变量指针等信息。  执行引擎:虚拟机的核心组件,负责执行虚拟机的字节码,一般先编译成机器码后执行。

    JAVA内存模型:(共享内存模型JMM)定义了一个线程对另一个线程可见。共享变量存放在主内存中,每个线程都有自己的本地内存,当多个线程同时访问一个数据时,可能本地内存没有及时刷新到主内存,所以就会发生线程安全问题。

    展开全文
  • Java内存结构 部分摘抄自:https://www.jianshu.com/p/73df0ac60551 首先Java内存结构其实是JVM内存结构 我们都知道,我们的java代码其实是不能直接运行的,他要经过一系列的步骤。 我们的java文件,首先要...
  • JVM这块知识绝对是学习java过程中的重点和难点,我习惯把这块的知识叫做javaSE高级基础,在学习jvm这块的知识,你一定会遇到几个概念,那就是java内存结构java内存模型,java对象模型和jvm内存结构!而这几个概念...
  • 转 开发十年,就只剩下这套架构体系了!! Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点...可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型...
  • 1、java内存模型和java内存结构有什么区别? 2、为什么要有内存模型? 3、java的内存模型是什么样子的? 这篇文章,基本上不会涉及到代码,全是一些概念性的知识,但是也是面试常问和java进阶所需要掌握的必要的基本...
  • 比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念...
  • 比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念...
  • 深入理解JVM-内存模型(jmm)GC java 内存模型
  • JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些...
  • JVM内存结构和Java内存模型 转载:https://zhuanlan.zhihu.com/p/38348646 转载理由:看看理论
  • 比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的...
  • Java内存结构 Java代码运行在JVM上,JVM将所管理的内存划分为不同的数据区域 上图是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规则。 上图划分的是逻辑区域,并不是绝对意义上的物理区域,...
  • 下面咱们来说说什么是java的内存模型,这个和java内存结构从字面意思上看真的很相似,但是实际上,这两者相差不小,要谈java的内存模型,那么这张图就是必不可少的。 这就是java内存模型结构图了,我们从图中就...
  • 比如本文我们要讨论的JVM内存结构Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构Java内存模型和Java对象模型这三者的概念...
  • JVM内存结构和Java内存模型别再傻傻分不清了

    万次阅读 多人点赞 2020-03-04 20:53:30
    JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多...
  • JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。其中有些区域随着虚拟机进程的启动而存在,而有些...
  • Java内存模型与内存结构1 Java内存模型2 Java内存结构(运行时数据区域)2.1 程序计数器(线程私有)2.2 Java虚拟机栈 (线程私有)2.3 本地方法栈(线程私有)2.4 Java堆(线程共享)2.5 方法区 (线程共享)2.6 ...
  • 转自:http://www.pinlue.com/article/2019/10/1822/239719642456.html
  • 转自:http://www.pinlue.com/article/2019/10/1822/239719642456.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,266
精华内容 906
关键字:

java内存模型和java内存结构

java 订阅