JVM内存模型.总述篇

Java内存模型

别称:Java Memory Model、JMM
作用:JMM定义了Java虚拟机(JVM)在计算机内存(RAM)中的工作方式
本质:共享内存模型
分类:1)JVM虚拟机数据区域
2)本地内存
含义:1)线程之间的共享变量存储在主内存中,每个线程都有一个私有的本地内存,本地内存中存储了该线程以读/写共享变量的副本
2)在JVM内部,Java内存模型把内存分成了线程栈区、堆区在这里插入图片描述

本地内存

含义:JMM的一个抽象概念,并不真实存在
分类:1)方式一
缓存、写缓冲区、寄存器、其他的硬件和编译器优化
2)方式二
元数据区、直接内存

直接内存

特点:1)不是虚拟机内存的一部分
2)不是Java虚拟机规范中定义的内存区域
3)这部分内存也被频繁地使用,而且也可能导致内存溢出异常

运行时数据区域

分类:1)程序计数器
2)Java虚拟机栈
3)本地方法栈
4)Java堆
5)方法区

程序计数器

别称:Program Counter Register
含义:是一块较小的内存空间
作用:可以看做是当前线程所执行的字节码的行号指示器
特点:1)如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址
2)如果线程正在执行的是一个Natvie方法,这个计数器值则为空(Undefined)
3)线程私有;为了线程切换后依然能恢复到原位,每条线程都需要有各自独立的程序计数器
4)JVM规范中唯一没有规定OutOfMemoryError情况的区域

本地方法栈

别称:Native Method Stack
作用:为JVM提供使用Native方法的服务
特点:1)线程私有
在这里插入图片描述

别称:Stack、栈内存、虚拟机栈、VM Stack、Java方法栈
适用:定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场
作用:1)主要用来执行程序
2)为JVM提供执行Java方法的服务
特点:1)每个线程私有,不能实现线程间的共享
2)存取速度快
3)大小必须确定
4)生存期必须确定
5)每个方法都对应一个栈帧
举例:String str = new String(“hello”);的变量str

别称:Heap、Heap Space、堆内存、堆区
适用:通过new关键字(由new创建的对象和数组)和构造器创建的对象
作用:主要用于存放对象
组成:新生代、老年代
形状:完全二叉树、平衡二叉树
特点:1)各个线程共享的内存区域
2)存取速度慢
3)可以运行时动态分配内存
4)生存期不需要提前确定
5)年老代和年轻代的划分对垃圾收集影响比较大
6)Java GC机制所管理的主要内存区域
举例:String str = new String(“hello”);的用new创建出来的字符串对象

方法区

别称:Method Area、永久代、Non-Heap、非堆
适用:程序中的字面量和常量(类代码信息、静态变量、字符串变量)
作用:存放程序中永远是不变或唯一的内容
组成:常量池、静态域等
特点:1)各个线程共享的内存区域
2)
举例:1)String str = new String(“hello”);的"hello"这个字面量
2)String str = “hello”;的str

运行时常量池

别称:Runtime Constant Pool
特点:1)是方法区的一部分
作用:用于存放编译时期生成的各种字面量和符号引用

在这里插入图片描述

JVM的内存区域的公有和私有问题

分类:1)线程共享的内存区域:方法区、堆
2)线程私有的内存区域:Java栈、本地方法栈、程序计数器
依据:JVM和系统调用间的关系

JVM的内存分类

分类:1)堆内内存
2)堆外内存

堆内内存

别称:堆内存、on-heap memory
含义:Java分配的非空对象都是由java虚拟机的垃圾收集器管理的内存
特点:1)完全由JVM负责分配和释放
2)如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误

堆外内存

别称:直接内存、off-heap memory
作用:为了能直接分配和释放内存,提高效率
适用:JNI、Deflater/Inflater、DirectByteBuffer(NIO中会用到)使用的
2.内存区域.模型篇.txt7.7 KB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值