一.运行时数据区域

线程私有的:程序计数器+虚拟机栈+本地方法栈

线程共享的:堆+方法区(运行时常量池)+直接内存(非运行时数据区的一部分)

*JDK1.8后将方法区废除,新增元空间。

1.1 程序计数器

记录指令的偏移地址,是唯一一个不会出现OutOfMemoryError的内存区域。

思考:为什么不会出现OutOfMemoryError?

OutOfMemoryError出现原因是由于运行时内存动态扩增导致内存不够用,而程序计数器是当执行到下一条指令的时候,改变的只是程序计数器中保存的地址,不需要申请新的内存来保存新的指令地址,因此,永远不会出现OutOfMemoryError

1.2 Java虚拟机栈

虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务

实际上,Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。

局部变量表主要存放了编译器可知的各种数据类型、对象引用。

1.3 本地方法栈

与虚拟机栈类似,只不过是为native方法服务

1.4 堆

垃圾收集管理(GC)的主要区域,主要存放对象实例,给对象和数组分配内存

1.5 方法区(目前由元空间取代)

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

”永久代“用来实现方法区,使GC能像管理堆一样管理内存

*JDK1.8后被元空间取代,使用直接内存。

1.6 运行时常量池

用于存放编译期生成的各种字面量和符号引用,例如:String a="123"

JDK1.7后将运行时常量池从方法区中移了出来,在 堆(Heap)中指定一块区域存放运行时常量池。

1.7 直接内存

不属于JVM运行时数据区域,但也会发生OutOfMemoryError

JVM学习心得—JVM内存模型(个人整理,请勿转载)的更多相关文章

  1. JVM学习总结一——内存模型

    JVM是java知识体系的基石之一,任何一个java程序的运行,都要借助于他.或许对于我这种初级程序员而言,工作中很少有必要刻意去关注JVM,然而如果能对这块知识有所了解,就能够更清晰的明白程序的运行 ...

  2. JVM学习记录-Java内存模型(一)

    前言 Java虚拟机规范中定义了一种Java的内存模型,即Java Memoory Model(简称JMM),用来实现让Java程序在各个平台下都能达到一致的内存访问效果.JVM是整个虚拟机,JMM模 ...

  3. JVM学习记录-Java内存模型(二)

    对于volatile型变量的特殊规则 关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制. 在处理多线程数据竞争问题时,不仅仅是可以使用synchronized关键字来实现,使用vo ...

  4. JVM学习01:内存结构

    JVM学习01:内存结构 写在前面:本系列分享主要参考资料是  周志明老师的<深入理解Java虚拟机>第二版. 内存结构知识要点Xmind梳理 案例分析 分析1 package com.h ...

  5. 深入理解JVM(③)学习Java的内存模型

    前言 Java内存模型(Java Memory Model)用来屏蔽各种硬件和操作系统的内存访问差异,这使得Java能够变得非常灵活而不用考虑各系统间的兼容性等问题.定义Java内存模型并非一件容易的 ...

  6. 【JVM】01虚拟机内存模型

    学习链接:https://blog.csdn.net/u010425776/article/details/51170118 博主整理的条理清晰,在这里先感谢博主分享 去年看视频学习写过一篇JVM的博 ...

  7. 【Java杂货铺】JVM#Java高墙之内存模型

    Java与C++之间有一堵由内存动态分配和垃圾回收技术所围成的"高墙",墙外的人想进去,墙外的人想出来.--<深入理解Java虚拟机> 前言 <深入理解Java虚 ...

  8. jvm系列五-java内存模型(2)

    原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...

  9. jvm系列五-java内存模型初览(1)

    本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关 ...

随机推荐

  1. day-25-类的继承顺序-父类对子类的约束-多态-队列和栈

    一.类的继承顺序 只要继承object类就是新式类 不继承object类的都是经典类 在python3 中所有的类都继承object类,都是新式类 在python2 中不继承object的类都是经典类 ...

  2. php文件的自动加载

    <?php spl_autoload_register(function ($class_name) { require_once $class_name . '.php'; });

  3. 【MRR】转-MySQL 的 MRR 优化

    MRR,全称「Multi-Range Read Optimization」. 简单说:MRR 通过把「随机磁盘读」,转化为「顺序磁盘读」,从而提高了索引查询的性能. 至于: 为什么要把随机读转化为顺序 ...

  4. 编译Android 4.4.4 r1的源码刷Nexus 5手机详细教程

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/54562606 网上关于编译Android源码的教程已经很多了,但是讲怎么编译And ...

  5. Mybatis的初始化和结合Spring Framework后初始化的源码探究

    带着下面的问题进行学习: (1)Mybatis 框架或 Spring Framework 框架对数据层 Mapper 接口做了代理,那是做了 JDK 动态代理还是 CGLIB 代理? (2)Mappe ...

  6. 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素

    [python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...

  7. UA: Literally Vulnerable靶机

    前言 略有点虎头蛇尾.主要有一步没想通. web打点 nmap -sP 192.168.218.0/24 #发现主机IP 192.168.218.138 #端口扫描 nmap -sV -p- 192. ...

  8. C++虚函数 - 静态函数能否为虚函数 .

    1.virtual与静态函数 C++中,静态成员函数不能被声明为virtual函数. 例如,下面的程序会编译失败. #include<iostream> class Test { publ ...

  9. 用fread和fwrite实现文件复制操作

    #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char ...

  10. Flutter 2.2 现已发布!

    在本次 Google I/O 2021 大会 上,我们正式发布了 Flutter 2.2.Flutter 2.2 是我们最新版的开源工具包,可让开发者立足单个平台构建适合任何设备的精美应用.Flutt ...