java中的内存概念(java内存区,gc内存区,JMM内存模型,cpu内存模型)

 2019-12-10 16:20  阅读(1174)
文章分类:Java Core

### 1、内存字眼 ### java里的内存概念很多,有:java内存区,gc内存区,JMM内存模型,cpu内存模型,对象内存布局。很容易混淆。 比如突然问:运行时数据区,堆和栈,新生代和老年代,工作内存与主内存,高速缓存与主内存,对象在内存中的存储布局。就找不到北了,都不知道哪个属于哪类范畴和概念。很多概念里都有内存这个字眼,真容易混淆起来,一脸懵逼。(之前我就一直混淆,懵逼) 通过对jvm的学习,下文会把这些概念进行描述和区分 ### 2、内存概念 ### 1. java内存区域(运行时数据区域) 2. gc内存区(垃圾回收) 3. CPU内存模型 4. JMM内存模型 5. 对象内存布局 #### 2.1、java内存区域(运行时数据区域) #### ![20191210001748\_1.png][20191210001748_1.png] ##### 2.1.1 程序计数器 ##### 可以看做是当前线程所执行的字节码的行号指示器。每个线程都有自己的程序计数器(线程私有) ##### 2.1.2 Java虚拟机栈(栈) ##### 线程私有,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息 局部变量表:存放了编译器可知的各种基本数据类型、对象引用(指针)、return Address类型(执行字节指令地址) ##### 2.1.3 Java堆(堆) ##### 堆内存区域的唯一目的就是存放对象实例, 所有对象实例以及数组都要在堆上分配(java虚拟机规范是这个规定但是随着技术发展现在已经不那么绝对),线程共享 注:java堆是垃圾回收器管理的主要区域,也被叫做“GC堆”。 **对象的内存布局**:对象头(Header),实例数据,对齐填充 补:对象,实例,引用的概念 ``` MyClass myClass=new MyClass(); new的时候在堆中新建了一个对象。这个对象是MyClass的实例。其中myClass是该对象的引用。 ``` ##### 2.1.4 方法区 ##### 线程共享,用于存储已经被虚拟机加载的:类信息、常量、静态变量、即使编译器编译后的代码等数据 运行时常量池:方法区的一部分,用于存放编译期生成的各种字面量和符号引用 #### 2.2 cpu 内存模型 #### 多处理器的内存模型,内存模型是一个抽象概念。 ![20191210001748\_2.png][20191210001748_2.png] #### 2.3 java 内存模型(JMM) #### c/c++直接作用在cpu或者操作系统的内存模型上,java自己做了JMM抽象。 java内存模型JMM包括两部分,一个是内存结构,一个是变量访问规则。这里主要描述内存结构,对访问规则不展开熬述。 ![20191210001748\_3.png][20191210001748_3.png] * 主内存:java内存模型规定了所有的**变量**都存储在主内存中 * 工作内存:线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝。线程对变量的所有操作(读,写)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同工作线程也不能直接访问对方工作内存中的变量。线程间的变量值传递需要通过主内存 * 变量:这里说的变量指的是共享变量包括:实例字段、静态字段、构成数组对象的元素。不包括形参和局部变量 补充: * 这里的主内存对应java堆中的对象实例的数据部分 * 工作内存对应 java栈 知识点:volatile变量 java 内存模型对volatile定义了特殊的访问规则。 第一,可见性规则,保证volatile对所有线程可见,即一线程改变了该变量值,新值对于其它线程来说是可以立即得知的。 第二,volatile禁止指令重排优化。 #### 2.4、GC内存区 #### ![20191210001748\_4.png][20191210001748_4.png] GC垃圾回收的内如很多包括:垃圾定位算法,内存分配结构,垃圾回收算法,垃圾回收器。这里只简单面熟gc内存区 * 新对象,实例化时内存分配在 eden 区,eden区耗尽的时,触发minor GC,将存活的对象放到Survivor的From区,清空Eden * minor gc 时把eden区和from区剩余的对象copy到to区,from to 功能交换。反复多次复制后还存活的对象(比如15次), 进入到老年代 * 当老年代的空间耗尽时,触发Major gc 补充: * 新生代垃圾回收器minor gc * 老年代垃圾回收器majar gc 速度比minor gc 慢很多 * full gc:清理整个堆空间—包括年轻代和永久代 * 永久代 是hotspot 在jdk8之前的概念。 ### 付 ### \[1\]深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)周志明著 [20191210001748_1.png]: https://gitee.com/chenssy/blog-home/raw/master/image/series-images/javaCore/javacore/20191210001748_1.png [20191210001748_2.png]: https://gitee.com/chenssy/blog-home/raw/master/image/series-images/javaCore/javacore/20191210001748_2.png [20191210001748_3.png]: https://gitee.com/chenssy/blog-home/raw/master/image/series-images/javaCore/javacore/20191210001748_3.png [20191210001748_4.png]: https://gitee.com/chenssy/blog-home/raw/master/image/series-images/javaCore/javacore/20191210001748_4.png

点赞(0)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> java中的内存概念(java内存区,gc内存区,JMM内存模型,cpu内存模型)

相关推荐