「java内存模型pdf」Java内存模型图
本篇文章给大家谈谈java内存模型pdf,以及Java内存模型图对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、什么是Java内存模型?
- 2、北大青鸟设计培训:Java内存模型原理?
- 3、Java内存结构与模型
- 4、深入理解java虚拟机第二版和第三版的区别?
- 5、JMM内存模型
- 6、北大青鸟java培训:java多线程的内存模型?
什么是Java内存模型?
1.java内存模型简称JMM
2.通俗点讲就是指你代码中写的那些内容在内存中是怎么存储的
3.比如说 Student stu = new Student();int a = 5; 你新建了一个学生类,建立了一个变量a,这些内容在内存中是咋存储的,
4.大的来说JMM分为堆栈,一般情况下学生类分配在堆,变量a分配在栈,
北大青鸟设计培训:Java内存模型原理?
这篇文章主要介绍模型产生的问题背景,解决的问题,处理思路,相关实现规则,环环相扣,希望读者看完这篇文章后能对Java内存模型体系产生一个相对清晰的理解,知其然知其所以然。
内存模型产生背景在介绍Java内存模型之前,java课程认为应该先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。
物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机的解决方案对虚拟机的实现有相当的参考意义。
物理机的并发问题硬件的效率问题计算机处理器处理绝大多数运行任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个I/O操作很难消除(无法仅靠寄存器完成所有运算任务)。
由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存完成读写操作,现代计算机系统通过加入一层读写速度尽可能接近处理器运算速度的高速缓存。
缓存作为内存和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。
缓存一致性问题基于高速缓存的存储系统交互很好的解决了处理器与内存速度的矛盾,但是也为计算机系统带来更高的复杂度,因为引入了一个新问题:缓存一致性。
在多处理器的系统中(或者单处理器多核的系统),每个处理器(每个核)都有自己的高速缓存,而它们有共享同一主内存(MainMemory)。
当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。
为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。
Java内存结构与模型
一 java内存结构
Heap(堆) 实例分配的地方 通过 Xms与 Xmx来设置
MethodArea(方法区域) 类的信息及静态变量 对应是Permanet Generation 通过 XX PermSize来设置
JavaStack(java的栈) 虚拟机只会直接对Javastack执行两种操作 以帧为单位的压栈或出栈 通过 Xss来设置 若不够会抛出StackOverflowError
ProgramCounter(程序计数器) 每一个线程都有它自己的PC寄存器 也是该线程启动时创建的 PC寄存器的内容总是指向下一条将被执行指令的饿地址 这里的地址可以是一个本地指针 也可以是在方法区中相对应于该方法起始指令的偏移量
Nativemethodstack(本地方法栈) 保存native方法进入区域的地址
当中Heap和MethodArea是被所有线程的共享使用的
而Javastack Programcounter和Nativemethodstack是以线程为粒度的 每个线程独自拥有自己的部分
二 内存模型
由以上可以知道java内存分为main memory和线程的Working Memory 就会涉及到这两种内存数据同步以及多个线程操作时数据一致性和可见性的问题 这就不可避免要加锁了 在java中可采用如下的形式
synchronized关键字或使用ncurrent locks中的锁
volatile关键字 Volatile表示的是线程每次操作都是在主内存中进行 这只能保证其可见性 而不能保证其的原子性 要有原子性还得加锁
final变量(基本类型 类类型还是可以改值的)
三 如何保证线程安全
每个线程只操作自有的数据 这个可能性要小
设计的类无数据成员 也就没有共享变量 要有可用是 final或volatile
lishixinzhi/Article/program/Java/hx/201311/26489
深入理解java虚拟机第二版和第三版的区别?
区别:
第三版是一款针对java学习打造的图书,它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,而第二版不仅技术更新、内容更丰富,而且实战性更强。
【第二版】
《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。
第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解书中后面内容有重要帮助。
第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监控与故障处理工具的原理和使用方法。
第三部分分析了虚拟机的执行子系统,包括类文件结构、虚拟机类加载机制、虚拟机字节码执行引擎。
第四部分讲解了程序的编译与代码的优化,阐述了泛型、自动装箱拆箱、条件编译等语法糖的原理;讲解了虚拟机的热点探测方法、HotSpot的即时编译器、编译触发条件,以及如何从虚拟机外部观察和分析JIT编译的数据和结果;
第五部分探讨了Java实现高效并发的原理,包括JVM内存模型的结构和操作;原子性、可见性和有序性在Java内存模型中的体现;先行发生原则的规则和使用;线程在Java语言中的实现原理;虚拟机实现高效并发所做的一系列锁优化措施。
【第三版】
深入理解java虚拟机第三版pdf是一款针对java学习打造的图书,它从Java程序员的角度出发,系统地将Java程序运行过程中涉及的各种知识整合到了一起,并配以日常工作中可能会碰到的疑难案例,引领读者轻松踏上探索Java虚拟机的旅途。
JMM内存模型
java内存模型(java memory model简称jmm) 是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规定定义
通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JVM运行程序的实体是线程,而每个线程都会为JVM创建一个工作内存(有些地方成为栈空间),用来存储线程私有的数据,而java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存进行,首先要将变量从主内存拷贝到自己的工作内存空间,然后对变量进行做操,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝,前面说过,工作内存是每个线程的私有数据区域,因此不能的线程间无法访问对方的工作内存,线程之间的通信(传值)必须通过主内存来完成。
JMM与JVM内存区域的划分是不同的概念层次,更恰当说JMM描述的是一组规则,通过这组规则控制程序各个变量在共享数据区域和私有数据区域的访问方式, JMM是围绕原子性,有序性,可见性展开。 JMM与java内存区域唯一相似点,都存在共享区域和私有数据区域,在JMM中主内存属于共享数据区域,从某个程度上讲应该包括了堆和方法去,而工作内存数据线程私有数据区域,在JMM中主内存属于共享数据区域,从某种程度上讲应该包括了堆和方法去,而工作内存数据线成私有数据区域,从某个程度上讲泽应该包括程序计数器、虚拟机栈及本地方发栈。
主内存是由线程共享的,但是主内存不是堆。工作内存就是个抽象的东西如果在jvm里就是堆里栈里,硬件就是cpu里内存里。
比如线程a和线程b修改同一个值, 那个值就是共享变量。 他不会一直在主内存存取,他会拷贝一份到工作内存,然后线程读取工作内存中的共享变量。就算线程b中进行操作,也不会主内存直接修改,会先存在工作内存中
(1) lock(锁定) :作用于主内存的变量,把一个变量标记为一条线程独占状态
(2) unlock(解锁) :作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
(3) read(读取) :作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用
(4) load(载入) :作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中
(5) use(使用) :作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎
(6) assign(赋值) :作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量
(7) store(存储) :作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作
(8) write(写入) :作用于工作内存的变量,它把store操作从工作内存中的一个变量的值传送到主内存的变量中
北大青鸟java培训:java多线程的内存模型?
硬件的内存模型物理机并发处理的方案对于jvm的内存模型实现,也有很大的参考作用,毕竟jvm也是在硬件层上来做事情,底层架构也决定了上层的建筑建模方式。
计算机并发并非只是多个处理器都参与进来计算就可以了,会牵扯到一些列硬件的问题,最直接的就是要和内存做交互。
但计算机的存储设备与处理器的预算速度相差太大,完全不能满足处理器的处理速度,怎么办,这就是后续加入的一层读写速度接近处理器运算速度的高速缓存来作为处理器和内存之间的缓冲。
高速缓存一边把使用的数据,从内存复制搬入,方便处理器快速运算,一边把运算后的数据,再同步到主内存中,如此处理器就无需等待了。
高速缓存虽然解决了处理器和内存的矛盾,但也为计算机带来了另一个问题:缓存一致性。
特别是当多个处理器都涉及到同一块主内存区域的时候,将可能会导致各自的缓存数据不一致。
那么出现不一致情况的时候,以谁的为准?为了解决这个问题,处理器和内存之间的读写的时候需要遵循一定的协议来操作,这类协议有:MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等。
这就是上图中处理器、高速缓存、以及内存之间的处理方式。
另外除了高速缓存之外,为了充分利用处理器,处理器还会把输入的指令码进行乱序执行优化,只要保证输出一致,输入的信息可以乱序执行重组,所以程序中的语句计算顺序和输入代码的顺序并非一致。
JVM内存模型上面我们了解了硬件的内存模型,以此为借鉴,我们看看jvm的内存模型。
jvm定义的一套java内存模型为了能够跨平台达到一致的内存访问效果,从而屏蔽掉了各种硬件和操作系统的内存访问差异。
这点和c和c++并不一样,C和C++会直接使用物理硬件和操作系统的内存模型来处理,所以在各个平台上会有差异,这一点java不会。
java的内存模型规定了所有的变量都存储在主内存中,java课程发现每个线程拥有自己的工作内存,工作内存保存了该线程使用到的变量的主内存拷贝,线程对变量所有操作,读取,赋值,都必须在工作内存中进行,不能直接写主内存变量,线程间变量值的传递均需要主内存来完成。
java内存模型pdf的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Java内存模型图、java内存模型pdf的信息别忘了在本站进行查找喔。
发布于:2023-01-02,除非注明,否则均为
原创文章,转载请注明出处。