• JVM内存结构
  • Java内存模型
  • Java对象模型
  • 总结

首先分清楚几个词:JVM内存结构、Java内存模型、Java对象模型

JVM内存结构

Java程序执行过程中,内存会被划分为不同的数据区域,各个区域有各自的用途。
有些区域随虚拟机的启动而存在。有些区域随线程的启动而启动,随线程的结束而销毁。

线程私有的内存区域:

  • 程序计数器:可看做当前线程执行字节码的行号指示器,字节码解释器工作时通过改变计数器的值来选择下一条所需执行的字节码指令
  • 虚拟机栈:Java方法执行的栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用至执行完成的过程,都对应一个栈帧在虚拟机栈的入栈到出栈的过程。其中局部变量表是指:存放编译期可知的基本数据类型(boolean、byte、char、int等)、对象引用(reference类型)和 returnAddress类型(指向一条字节码指令的地址)
  • 本地方法栈:Native方法(非Java实现的方法)执行的栈帧

所有线程共享的内存区域:

  • 堆:存放对象实例数组,GC主要管理这一块
  • 方法区:存储被虚拟机加载的Class类信息包括成员方法和静态方法)、常量静态变量、即时编译器编译后的代码缓存等数据
    运行时常量池:存放编译生成的各种字面量和符号引用,运行期间也可能将新的常量放入池中

    各部分简介:
  1. 程序计数器:
    内存空间小,线程私有。字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完成。
    如果线程正在执行一个 Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
  2. Java虚拟机栈
    线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会创建一个栈帧(Stack Frame)。用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。
  3. 本地方法栈:
    区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。

  4. 对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。
  5. 方法区
    属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
  6. 运行时常量池
    属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。编译器和运行期(String 的 intern() )都可以将常量放入池中。内存有限,无法申请时抛出 OutOfMemoryError。
  7. 直接内存
    非虚拟机运行时数据区的部分

Java内存模型

Java堆和方法区是多个线程共享的数据区域。多个线程可以操作堆和方法区中的同一个数据。Java的线程间通过共享内存进行通信。

JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。
本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。
JMM主要是保证共享内存部分的原子性、可见性、有序性,内存模型定义了共享内存中多线程程序读写宝座行为的规范。
内存模型解决并发问题主要采用两种方式: 限制处理器优化和使用内存屏障。

Java对象模型

Java对象在JVM中的存储有一定的结构,Java对象自身的存储模型就叫做Java对象模型。

总结

JVM内存结构,和JVM的运行时区域有关。 Java内存模型,和Java的并发编程有关。 Java对象模型,和Java对象在虚拟机中的表现形式有关。

JVM篇-JVM内存结构与存储机制相关推荐

  1. 浅谈 JVM 内存结构及 GC 机制

    前言 JAVA GC(Garbage Collection,垃圾回收)机制是区别C++的一个重要特征,C++需要开发者自己实现垃圾回收的逻辑,而JAVA开发者则只需要专注于业务开发,因为垃圾回收这件繁 ...

  2. JVM详解——内存结构

    如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:耶瞳空间 一:JVM基本介绍 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,具体实现有很 ...

  3. JVM学习-Java内存结构(详细易懂)

    Java内存结构 1.JVM概述 2.程序计数器 2.1.定义 2.2.作用及特点解释 3.虚拟机栈 3.1.栈的特点 3.2.栈的演示 3.3.栈的问题辨析 3.4.栈的线程安全问题 3.5.栈内存 ...

  4. [转]JVM运行时内存结构

    [转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...

  5. JVM运行时内存结构学习

    学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) :  1.方法区(Method Area) 类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说, ...

  6. <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

    笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录 1.JVM 与 Java 体系结构 1.1. 前言 1.2. 面向人群及参考书目 1.3. Java ...

  7. JVM内存与垃圾回收篇——JVM与Java体系结构

    前言 作为Java工程师的你曾被伤害过吗?你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却无从下手. 新项目上线,对各种JVM参数设 ...

  8. 原创 | 万万没想到,JVM内存结构的面试题可以问的这么难?

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 223 篇原创分享 作者 l Hollis 来源 l Hollis(ID:hollischuang) 在我的博客中,之前有 ...

  9. 万万没想到,JVM内存结构的面试题可以问的这么难?

    在我的博客中,之前有很多文章介绍过JVM内存结构,相信很多看多我文章的朋友对这部分知识都有一定的了解了. 那么,请大家尝试着回答一下以下问题: 1.JVM管理的内存结构是怎样的?  2.不同的虚拟机在 ...

  10. JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...

最新文章

  1. Asp.net后台创建HTML
  2. Ubuntu下Django+uWSGI+nginx部署
  3. 利用七牛云实现简单的图床
  4. 网页从web服务器受到的威胁,[多选] Web从web服务器方面和浏览器方面受到的威胁主要来自()。...
  5. 误删除了_msdcs.domain.com
  6. Linux进程 管理,Linux进程查看与管理以及作业控制
  7. 第16章:MongoDB-聚合操作--聚合管道--$project
  8. 重要的是改变命运,而非升职加薪
  9. Linux上的Django项目,下载文件报错,编码格式错误解决
  10. IoC容器9——基于注解的容器配置
  11. 递归和循环两种方式求解连续数的相加
  12. C语言———求”完数“
  13. 利用过滤器(Filter)统一处理请与响应乱码
  14. 【SAS系列】SAS入门书籍推荐
  15. CentOS 编译安装 MySQL5.7
  16. 秒懂HTTPS接口(原理篇)
  17. linux渲染农场大连教程,Deadline渲染农场搭建
  18. 加快黑群晖套件中心的套件下载速度
  19. DirectX11 Tessellation曲面细分实现动态增加模型细节
  20. **[UE4技巧]** UE4 的导入模型人物处理(下) — 全面替换小白人,实现人物模型自由

热门文章

  1. CSS——div垂直居中及div内文字垂直居中
  2. 令 Debian 支援中文
  3. Python 实现导入三份EXCEL表自动生成每周的考核周报WORD文档
  4. 安全视角下的CAN协议分析
  5. 走进波分 -- 14.OSN902产品介绍
  6. kvaser怎么用?Kvaser 汽车CAN通讯协议总线分析仪新手入门常见问题解决方案教程
  7. 网易云课堂 oracle,网易云课堂DBA学习笔记 (一) 数据库基础
  8. Oracle + PlSql 下载安装配置
  9. DHZT_ROS_Developer_Guide 大华中天ROS风格指南
  10. Toad:基于 Python 的标准化评分卡模型