JVM 内存结构快速入门

这篇具有很好参考价值的文章主要介绍了JVM 内存结构快速入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、简介

  Java 内存模型(Java Memory Model,JMM)是一种规范,定义了 Java 程序中多线程并发访问共享变量时的行为和规则。

二、JVM内存区域

  线程共享:方法区、堆
  线程独有:栈、程序计数器

JVM 内存结构快速入门,JVM,jvm

2.1 方法区

  方法区是JVM中的一块内存区域,在JVM启动时被创建,与堆内存分开管理。方法区的大小可以通过-XX:MetaspaceSize-XX:MaxMetaspaceSize参数进行调整。

  存储的内容有:

  • 类的结构信息:包括类的字段、方法、父类、接口等
  • 常量池
  • 静态变量
  • 即时编译器编译后的代码
2.3.2 永久代和元空间

  在Java虚拟机(JVM)的不同版本中,永久代(Permanent Generation)和元空间(Metaspace)是用于存储类相关信息的内存区域,都是实现方法区的方式。

  1. 永久代(Permanent Generation):
    1.8版本以前有永久代,永久代放在JVM内存中,在某些情况下存在一些问题。例如,如果加载的类过多或过大,永久代的大小可能会不够,导致OutOfMemoryError。由于这些问题,从JDK 8开始,永久代被元空间所取代。

  2. 元空间(Metaspace):
    元空间是JDK 8及更高版本中取代永久代的新的内存区域。元空间同样用于存储类的结构信息、常量池、静态变量和即时编译器编译后的代码等。与永久代不同,元空间的大小不再受限于固定的内存大小,而是根据应用程序的需求进行动态分配。元空间的数据存储在本地内存(Native Memory)中,而不是像永久代那样存储在Java运行时内存中。这意味着元空间的大小受限于可用的物理内存。如果元空间的内存耗尽,JVM依然会抛出OutOfMemoryError。
    JVM 内存结构快速入门,JVM,jvm

2.2 堆

  堆内存是Java程序中最大的一块内存区域,用于存储对象实例和数组。堆内存可以划分为不同的代,包括新生代(Eden区、Survivor区)和老年代。新创建的对象会被分配到新生代的Eden区,经过垃圾回收后,仍然存活的对象会被移到Survivor区,最终进入老年代。

1.8版本的堆结构:
  新生代与老年代的比例是1:2
  Eden、s0、s1的比例是8比1比1
JVM 内存结构快速入门,JVM,jvm

1.9及以后的堆结构
  G1将内存划分成了多个大小相等的Region(默认是512K),Region逻辑上连续,物理内存地址不连续。同时每个Region被标记成E、S、O、H,分别表示Eden、Survivor、Old、Humongous。其中E、S属于年轻代,O与H属于老年代。

  H表示Humongous。从字面上就可以理解表示大的对象(下面简称H对象)。当分配的对象大于等于Region大小的一半的时候就会被认为是巨型对象。H对象默认分配在老年代,可以防止GC的时候大对象的内存拷贝。
JVM 内存结构快速入门,JVM,jvm

2.1.2 对象的创建和销毁

  在Java中,对象的创建通过new关键字实现。当调用new关键字创建对象时,JVM会在堆内存中分配一块内存空间用于存储对象的实例变量,并执行构造方法对对象进行初始化。对象的销毁由垃圾回收器负责,当对象不再被引用时,垃圾回收器会回收该对象的内存空间。

  创建流程:

  1. ⾸先检查这个指令的参数是否能在常量池中定位到⼀个类的符号引⽤
  2. 检查这个符号引⽤代表的类是否已被加载、解析和初始化过。如果没有,就先执⾏相应的类加载过程
  3. 类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。
  4. 内存分配完成之后,虚拟机将分配到的内存空间(但不包括对象头)都初始化为零值。
  5. 接下来设置对象头,请求头⾥包含了对象是哪个类的实例、如何才能找到类的元数据信息、对象的 哈希码、对象的 GC 分代年龄等信息
    JVM 内存结构快速入门,JVM,jvm

2.2 栈内存


  栈分为本地方法栈和java方法栈。
JVM 内存结构快速入门,JVM,jvm

  每个线程在创建时都会创建一个java方法栈,栈内会保存一个个的栈帧,每个栈帧对应一个方法。
  栈采用先进后出的数据结构,方法的调用和返回都是通过栈帧的入栈和出栈来实现的。
JVM 内存结构快速入门,JVM,jvm

2.2.1 栈帧的组成和作用

  栈帧是栈内存中的一个元素,用于存储方法的局部变量表、操作数栈、动态链接、方法返回地址等信息。局部变量表用于存储方法的局部变量和参数,操作数栈用于存储方法执行过程中的操作数和中间结果。栈帧的作用是提供方法调用和执行的环境,保证方法的独立性和数据的隔离性。
JVM 内存结构快速入门,JVM,jvm

2.2.2 栈的特点
  1. 栈是线程私有的
  2. 一个方法开始执行栈帧入栈、方法执行完对应的栈帧就出栈,所以虚拟机栈不需要进行垃圾回收
  3. 虚拟机栈存在OutOfMemoryError、以及StackOverflowError
  4. 线程太多,就可能会出现OutOfMemoryError,线程创建时没有足够的内存去创建虚拟机栈了
  5. 方法调用层次太多,就可能会出现StackOverflowError(栈的大小有限)
  6. 可以通过-Xss来设置虚拟机栈的大小

2.4 程序计数器

2.4.1 程序计数器的作用和使用场景

  程序计数器是一块较小的内存区域,用于存储当前线程执行的字节码指令的地址。程序计数器在多线程环境下,每个线程都有独立的程序计数器,用于记录各个线程执行的位置,保证线程切换后能正确恢复执行。文章来源地址https://www.toymoban.com/news/detail-650922.html

到了这里,关于JVM 内存结构快速入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM内存结构介绍

    一、java代码编译执行过程   1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件)   2.类加载:通过ClassLoader及其子类来完成JVM的类加载   3.类执行:字节码被装入内存,进入JVM虚拟机,被解释器解释执行         注:Java平台由Java虚拟机和Java应用程序接口

    2024年02月16日
    浏览(37)
  • JVM 内存结构

    Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在

    2024年02月11日
    浏览(36)
  • JVM-内存结构

    1、定义 程序计数器(Program Counter)是JVM中的一块较小的内存区域,它是一个指向当前线程正在执行的字节码指令的指针。 程序计数器使用的是寄存器 ,特点-快。 程序计数器作用是 记住下一条jvm执行的执行地址。 特点: 线程私有的 不会存在内存溢出-jvm规定了 2、作用 程

    2024年02月15日
    浏览(45)
  • 【JVM 内存结构丨栈】

    主页传送门:📀 传送   栈是用于执行线程的内存区域,它包括局部变量和操作数栈。 Java 虚拟机栈会为每一个即将运行的 Java 方法创建一块叫做“栈帧”的区域,用于存放该方法运行过程中的一些信息,如: 局部变量表 操作数栈 动态链接 方法出口信息 … 图示如下 :

    2024年02月11日
    浏览(31)
  • 复习一下JVM内存结构

    程序计数器内存很小,可以看作是 当前线程 所执行字节码的 行号指示器 。 有了它,程序就能被正确的执行。 因为有 线程切换 的存在,则每个线程必须有各自独立的程序计数器,即 线程私有 的内存。 这里再解释一下什么是 线程切换 ,线程切换指的是: 单处理器在执行

    2024年02月20日
    浏览(108)
  • JVM内存结构

    类加载:类源代码经编译器编译为二进制字节码,通过 类加载器 加载到JVM JVM内存:类存放 方法区 ,实例对象存放 堆 中,方法调用时用到 虚拟机栈、程序计数器、本地方法栈 执行引擎: 解释器 逐行解释执行方法代码,热点代码由 JIT 做编译、优化后的执行, GC 负责回收堆中不再被引

    2024年01月25日
    浏览(31)
  • 【JVM】内存结构

    Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在

    2024年01月23日
    浏览(33)
  • JVM学习笔记(二)内存结构

    目录   一、JVM内存结构 1. 虚拟机栈(JVM Stacks) 1)定义 2)栈内存溢出 3) 线程运行诊断 案例1:CPU占用过高 案例2:程序运行很长时间没有结果​编辑 2. 本地方法栈(Native Method Stacks) 3.  堆(Heap) 1)定义 2)特点 3)堆内存溢出 4)堆内存诊断 5)案例:垃圾回收后,内存

    2024年02月16日
    浏览(35)
  • 【JVM 内存结构 | 程序计数器】

    主页传送门:📀 传送 Java 虚拟机的内存空间由 堆、栈、方法区、程序计数器和本地方法栈五部分组成。   JVM(Java Virtual Machine)内存结构包括以下几个部分: 堆区(Heap):堆区是最大的一块内存区域,由所有线程共享。所有的对象实例以及数组都在这块内存中分配。 方

    2024年02月11日
    浏览(44)
  • JVM快速入门篇

    请你谈谈你对jvm的理解? Java8虚拟机和之前的变化更新? 什么是OOM?什么是栈溢出StackOverFlowError?怎么分析? jvm的常见调优参数有哪些? 内存快照如何抓取?怎么分析Dump文件? 谈谈jvm中,类加载器你的认识? 1. JVM的位置 2. JVM的体系结构 3. 类加载器 4. 双亲委派机制 5

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包