JVM 内存模型组成+经典总结
Java内存模型(Java Memory Model),简称JMM,定义了JVM(Java虚拟机)在计算机内存(RAM)中的工作方式,目的是定义一个一致的、跨平台的内存模型,是隶属于JVM的。
内存模型的组成
线程私有
Thread Local
私有数据区域其它线程不可见,生命周期随着线程的的启动而创建,线程结束而销毁。
程序计数器
描述
- 线程执行的字节码行号指示器,通过改变这个计数器来获取下一条执行的指令
分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖这个计数器来完成
- 线程执行的字节码行号指示器,通过改变这个计数器来获取下一条执行的指令
特点
- 指向虚拟机字节码指令的位置
唯一一个不会OOM的区域
- 指向虚拟机字节码指令的位置
虚拟机栈
VM Stack
虚拟机栈生命周期==线程生命周期
所以对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就over一个线程中,每调用一个方法创建一个栈帧(Stack Frame)
栈帧结构
- 局部变量表
Local Variable Table - 操作栈
Operand Stack - 动态连接
Dynamic Linking - 返回地址
Return Address - … …
- 局部变量表
本地方法栈
Local Method Stack
- 为本地Native方法服务
线程共享
Thread Shard
Java堆(类实例区)
Objects
存放对象实例,也是垃圾收集器主要的管理区域
区域
新生代
- eden
- from survivor
- to survivor
老年代
方法区(永久代)
Method Area
数据
存储虚拟机加载的类信息
即时编译后的代码
运行时常量池 RCP(Runtime Constant Pool)
直接常量(基本类型、String)
其它类型方法字段的引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
静态变量
特点
- 垃圾收集器行为很少在此区域发生,主要针对类的卸载、运行时常量池的回收
在java1.8中已移至Matespace区,存储在本地对内存中,不受java堆大小限制,也是为了更好的和JRockit整合
常量和静态变量移至堆中,其余保持不变,不会再有垃圾回收器扫描元空间
直接内存
Direct Memory
不受JVM GC管理
并不是JVM的一部分,可以使用native函数直接分配堆外内存,然后使用DirectByteBuffer对这块内存的引用进行操作,避免在Java堆和Native之间来回复制数据,在一些场景中可以显著提高性能
总结(干货):
- 实例和对象的区别:Class a=new Class();此时的a是实例而不是对象,实例在栈中而对象在堆中,操作实例实际上是间接操作对象。多个实例可以指向一个对象。
- 栈中数据与堆中数据销毁并不是同步的。方法一旦结束,栈中的局部变量立即销毁,但是堆中的对象不一定销毁。因为可能其它变量也指向了这个对象,直到所有线程栈中没有变量指向这个对象时,它才销毁,而且不是马上销毁,需要等垃圾回收器扫描时才能销毁。
- 类的成员变量在不同对象中各不相同,都有自己的存储空间(在堆的对象中)。而类的方法是该类共享的,只有一套,存储在方法区中,当有对象使用方法时压入栈,方法不使用时不占用内存。
- 生命周期:对内存属于java应用程序使用,生命周期与jvm一致;栈内存属于线程私有,生命周期与线程相同
- 引用:不论合适何地创建对象,它总是存储在堆内存空间中,并且栈内存包含对它的引用。栈内存空间仅包含方法原始数据类型
局部变量
和堆空间中对象的引用变量
- 二者抛出异常方式:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常;堆内存不足时将抛出OutOfMemoryError异常
扩展: jdk8中新增的元数据空间
替换了原有的方法区,主要有如下变化:
1. 将方法区中的静态变量、常量池移到了堆中
2. 元空间大小取决于机器的可用内存大小
JVM 内存模型组成+经典总结相关推荐
- 《深入理解Java虚拟机》读后总结(一)JVM内存模型
基于Sun HotSpot JVM 直接上图: 从图中看到,JVM内存分为两个主要区域,一个是所有线程共享的数据区,一个是线程隔离数据区(线程私有) 线程隔离数据区 程序计数器(Program Cou ...
- 深入理解JAVA虚拟机学习笔记(一)JVM内存模型
摘要: 上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了.这段时间也是各种忙,都一个星期没更新博客了,再不写之前那种状 ...
- JVM内存模型-回忆学习总结
jvm在我们日常开发过程中比较少使用,但是当我们考虑到架构设计以及系统层面流程开发时,就不得不考虑jvm内存模型,JVM规定java运行的内存申请.分配.管理的策略,特别是在性能调优,系统异常排查是经 ...
- java面试-深入理解JVM(一)——JVM内存模型
JVM内存模型 Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. ...
- Java JVM内存模型
简述JVM内存模型 线程私有的运行时数据区: 程序计数器.Java 虚拟机栈.本地方法栈. 线程共享的运行时数据区:Java 堆.方法区. 简述程序计数器 程序计数器表示当前线程所执行的字节码的行号指 ...
- Java基础:由JVM内存模型详解线程安全
1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...
- JVM 内存模型:方法区(Method Area)
1. 前言 最近在研究Java语言底层基础知识,发现对于JVM 内存模型理解不够深入.笔者突发奇想深入理解JVM内存模型,特在此介绍详细介绍一下JVM内存模型中的方法区.看似名称叫做方法区,其实不然. ...
- JVM内存模型、Java内存模型 和 Java对象模型
一.JVM内存模型 1.JVM运行时数据区 二.Java内存模型(JMM) 1.JMM 三.Java对象模型 1.Java对象在JVM中的存储模型称之为Java对象模型. 四.总结 1.JVM内存 ...
- JVM内存模型、指令重排、内存屏障概念解析
在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...
最新文章
- Oracle 正则表达式
- Traceback (most recent call last): File AttributeError: 'NoneType' object has no attribute 'group'
- oracle开发常用,oracle开发常用关键字
- 讲座预告 | 全年最值得看的英仙座流星雨要来 如何一晚看上百流星
- C语言-用gcc指令体验C语言编译过程
- 【视频课】永久免费!5小时快速掌握Pytorch框架入门及实战
- Android 监听手机GPS打开状态
- vscode配置vue环境
- Stern-Brocot Tree
- codeforces1453 E. Dog Snacks
- 基于 Docker 打造前端持续集成开发环境
- 查看socket缓冲区数据_什么是socket缓冲区?
- WordPress主题 酱茄模块源码
- HTML5 文本元素
- hive数据写入elasticsearch
- 最近在写个人网站,忙碌中。。。
- Scala语言精华版笔记整理
- [渝粤题库]西北工业大学离散数学
- android操作系统偷流量,运营商在“偷流量”?用实验告诉你真相!
- 矿大计算机考研上岸分数,2021--2022中国矿业大学动力工程考研上岸心得及分数线报录比...
热门文章
- java面试题2021最新
- 关于提高自己Java水平十大技术
- D3.js以及通用JS(JavaScript)读取并解析server端JSON的注意事项
- 当大数据遇上“智慧园区”会怎样?
- Laravel 5.1 源码阅读
- [LeetCode]--3. Longest Substring Without Repeating Characters
- 解决linux删除文件后空间没有释放问题
- 我的Linux折腾史
- 我来重新学习js的面向对象(part 4)
- 三十六、【减小apk包的体积】