学习JVM运行模型比较重要,先看一幅图片:

运行时数据区(内存结构) :

 1.方法区(Method Area
类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义。简单来说,所有定义的方法的信息都保存在该区域,静态变量+常量+类信息(构造方法/接口定义)+运行时常量池都存在方法区中,

虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是为了和Java的堆区分开 .

2.堆(Heap
虚拟机启动时自动分配创建,用于存放对象的实例,几乎所有对象(包括常量池)都在堆上分配内存,当对象无法在该空间申请到内存是将抛出OutOfMemoryError异常。同时也是垃圾收集器管理的主要区域。 堆的内存分配图如下:

      堆的内存回收顺序图(虚拟机调优的目的: 就是为了减少Full GC的次数):

                   

 2.1 新生代(Young Generation
类出生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。
新生代分为两部分:伊甸区(Eden space)和幸存者区(Survivor space),所有的类都是在伊甸区被new出来的。幸存区又分为From和To区。当Eden区的空间用完是,程序又需要创建对象,JVM的垃圾回收器将Eden区进行垃圾回
收(Minor GC),将Eden区中的不再被其它对象应用的对象进行销毁。然后将Eden区中剩余的对象移到From Survivor区。若From Survivor区也满了,再对该区进行垃圾回收,然后移动到To Survivor区。

2.2 老年代(Old Generation
新生代经过多次(具体多少次?)GC仍然存货的对象移动到老年区。若老年代也满了,这时候将发生Major GC(也可以叫Full GC),进行老年区的内存清理。若老年区执行了Full GC之后发现依然无法进行对象的保存,就会抛出
OOM(OutOfMemoryError)异常

2.3 元空间(Meta Space
在JDK1.8之后,元空间替代了永久代,它是对JVM规范中方法区的实现,区别在于元数据区不在虚拟机当中,而是用的本地内存,永久代在虚拟机当中,永久代逻辑结构上也属于堆,但是物理上不属于。

为什么移除了永久代?
参考官方解释http://openjdk.java.net/jeps/122
大概意思是移除永久代是为融合HotSpot与 JRockit而做出的努力,因为JRockit没有永久代,不需要配置永久代。

3.(Stack)
Java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行的同时都会创建一个栈帧(用于存储局部变量表,操作数栈,动态链接,方法出口等信息)不存在垃圾回收问题,只要线程一结束该栈就释放,生命周期和线程一致

4.本地方法栈(Native Method Stack)
和栈作用很相似,区别不过是Java栈为JVM执行Java方法服务,而本地方法栈为JVM执行native方法服务。登记native方法,在Execution Engine(jvm执行引擎)执行时加载本地方法库

5.程序计数器(Program Counter Register)
就是一个指针,指向方法区中的方法字节码(用来存储指向吓一跳指令的地址,也即将要执行的指令代码),由执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计

      参考链接: https://segmentfault.com/a/1190000016694247

java内存模型参考链接:    https://www.cnblogs.com/nexiyi/p/java_memory_model_and_thread.html

转载于:https://www.cnblogs.com/ganbo/p/10995326.html

JVM运行时内存结构学习相关推荐

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

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

  2. 【Android 逆向】Android 逆向基本概念 ( 软件运行时内存结构 | 文件与内存之间的联系 )

    文章目录 一.Android 软件运行时内存结构 二.Android 文件与内存之间的联系 一.Android 软件运行时内存结构 Android 软件运行时内存结构 : 硬件层 : 内存中 , 硬件 ...

  3. Java 虚拟机(JVM)运行时内存结构

    1.PC Register(pc寄存器) Java虚拟机线程都有自己的pc寄存器.一条Java虚拟机线程只会同时执行一个方法的代码,这个方法称为该线程的当前方法.如果这个方法不是native的,那么p ...

  4. Java的JVM运行时栈结构和方法调用详解

    详细介绍了Java 的JVM的运行时栈结构,以及和方法调用详解,包括解析调用和分派调用. JVM对于方法的执行是基于栈的,方法调用--入栈,方法调用完毕--出栈,了解JVM的运行时栈结构,有助于我们更 ...

  5. 运行时常量池在哪里_Java虚拟机详解(二)------运行时内存结构

    首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生 ...

  6. java runtime类 heap_Java 进阶(一) JVM运行时内存模型

    1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果 ...

  7. JVM运行时内存概念-堆栈及新生代、老年代、持久代

    JVM内存有一些按不同标准划分的概念,这里来理清一下. 一.首先java虚拟机规范定义了java运行时数据区在概念上应该有的分区,这是抽象概念不对应也不限制物理上的具体实现,不同的虚拟机可以有不同的实 ...

  8. 尝试用HSDB分析JVM运行时内存理解Java多态实现机制

    测试代码 // 接口 package ziya; public interface TestParent {void show(); }package ziya; public class Paren ...

  9. 在没有任何数据时进行无效的读取尝试。_技术转载——JVM运行时内存是怎么分布的?...

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:https://github.com/ ...

最新文章

  1. SP348 EXPEDI - Expedition(有趣的贪心,优先队列)
  2. vuejs基础玩法(基础知识,不喜勿喷!)
  3. oracle4045,ORACLE 错误 4045
  4. [pytorch、学习] - 9.2 微调
  5. windows安装64位Pygame方法
  6. 写得好的html网页,优化网站排名-使用Markdown编写更好的内容和HTML
  7. deepin安装mysql失败_deepin20无法安装mysql
  8. 3d激光雷达开发(voxel滤波)
  9. md5修改器v1.0
  10. Android 代码中执行adb shell命令
  11. 论文阅读--Emotion Recognition in Conversation: Research Challenges, Datasets, and Recent Advances
  12. ubuntu安装腾讯会议
  13. MATLAB中clc命令详解
  14. Codeforces Gym 101173 K. Key Knocking (构造)
  15. 全球与中国无线充电芯片市场深度研究分析报告
  16. Java和JDK版本的关系
  17. linux远程可视化
  18. ubuntu18.04安装CUDA
  19. 浙大PAT 1021. Deepest Root (25)
  20. 网站降权的特征和原因有哪些呢?

热门文章

  1. 微信兵锋所向 阿里必将血流成河
  2. 星起航:抖音小店怎么设置达人佣金
  3. 简单ELT ( 内含系统计算器)
  4. 计算机更改设置打不开了,更改适配器设置打不开,显示适配器
  5. 如何不使用快压解压快压超高压缩比压缩的文件?
  6. c++智能指针的使用,auto_ptr,shared_ptr
  7. 【4.3 欧拉函数详解】
  8. linux gulp 安装教程,linux – 安装gulp browserify始终给出错误
  9. linux下QQ如何使用
  10. Web 视频播放前前后后那些事