首页 > 系统相关 >7 JVM运行时内存区域

7 JVM运行时内存区域

时间:2024-03-05 15:58:53浏览次数:21  
标签:Java 虚拟机 局部变量 区域 内存 JVM 方法 栈帧

7 JVM运行时内存区域

​ JVM运行时内存区域主要包括五块:程序计数器、java虚拟机栈、本地方法栈、方法区、堆

​ 上述五块区域也可以分为线程共享线程不共享两部分

线程共享区域

  • 方法区

    方法区是存放基础信息的位置,主要包括三部分:

    • 类的元信息

      保存了所有类的基本信息

    • 运行时常量池

      保存了字节码文件中的常量池内容

    • 字符串常量池(JDK8将字符串常量池移动到了堆中)

      保存了字符串常量

    • 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上
    • 栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享
    • 堆空间有三个需要关注的值,used(表示当前已使用的堆内存)、total(java虚拟机已经分配的可用堆内存)、max(表示Java虚拟机可用分配的最大堆内存)

线程不共享区域

  • 程序计数器

    程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址

  • java虚拟机栈

    Java虚拟机栈 (Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出 (First in Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存(栈帧保存了方法的基本信息

    • 栈帧的组成
  • 局部变量表,局部变量表的作用是在运行过程中存放所有的局部变量

    • 栈帧中的局部变量表是一个数组,数组中每一个位置称之为槽(slot),longdouble类型占用两个槽,其他类型占用一个槽

    • 方法参数也会保存在局部变量表中,其顺序与方法中参数定义的顺序一致

    • 局部变量表保存的内容有:实例方法的this对象,方法的参数,方法体中声明的局部变量

    • 为了节省空间,局部变量表中的槽是可以复用的,一旦某个局部变量不再生效,当前槽就可以再次被使用

  • 操作数栈,操作数栈是栈帧中虚拟机在执行指令过程中用来存放临时数据的一块区域

  • 帧数据,帧数据主要包含动态链接、方法出口、异常表的引用

    • 动态链接保存的是虚拟地址运行时常量池的物理地址的映射关系
      • 方法出口指的是方法在正确或者异常结束时,当前栈帧会被弹出,同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中,需要存储此方法出口的地址
      • 异常表存放的是代码中异常的处理信息,包含了try代码块和catch代码块执行后跳转到的字节码指令位置。
  • Java虚拟机栈-栈内存溢出

    • Java虚拟机栈如果栈帧过多,占用内存超过栈内存可以分配的最大大小就会出现内存溢出
      • Java虚拟机栈内存溢出时会出现StackOverflowError的错误
  • 本地方法栈

    • Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧
    • 在Hotspot虚拟机中,Java虚拟机栈和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内存上生成一个栈帧,临时保存方法的参数同时方便出现异常时也把本地方法的栈信息打印出来

标签:Java,虚拟机,局部变量,区域,内存,JVM,方法,栈帧
From: https://www.cnblogs.com/miaoyindian/p/18054206

相关文章

  • 8 JVM一些常用的参数
    8JVM一些常用的参数修改java虚拟机栈的大小,可以使用虚拟机参数-Xss,注HotSpot虚拟机对栈大小的最大值和最小值有要求(Windows下的JDK8测试最小值为180k,最大值为2048m)默认单位是字节B-Xss1m-Xss1g修改堆内存的max和total值设置堆内存max值默认单位是字节B-Xmx2g设置......
  • 9 JVM垃圾回收
    9JVM垃圾回收方法区的回收方法区中能回收的内容主要就是不再使用的类。判定一个类可以被回收,需要同时满足下面三个条件:1.此类所有实例对象都已经被回收,在堆中不存在任何该类的实例对象以及子类对象2.加载该类的类加载器已经被回收3.该类对应的java.lang.Class对象没有在任......
  • 解决rsyslog服务占用内存过高
    解决rsyslog服务占用内存过高一、问题描述:使用htop命令查看内存占用时,发现rsyslogd内存占用很高 二、排查查看状态journalctl-ursyslog执行journalctl--verify命令检查发现系统日志卷文件损坏错误journalctl--verify 三、解决1、删除上面损坏的journal文......
  • Qt Creator 内存分析
    Ubuntu内存分析安装sudoapt-getinstallvalgrind打开Qtcreator->Analyze->valgrind内存分析器Memcheck会列出可能内存泄露的文件(有很多是误报需要仔细分辨)Window内存分析下载Heobhttps://github.com/ssbssa/heob/releases解压到英文目录.exe打开Qtcreator->An......
  • Qt MSVC使用内存泄露检测工具 VLD(Visual Leak Detector)
    一、简介VLD=VisualLeakDetector,是一款用于VisualC++的免费的内存泄露检测工具,官网 kinddragon.github.io, GitHub 。先说优点:为每个泄漏的块提供完整的堆栈跟踪,包括源文件和行号信息(如果可用)。检测大多数(如果不是全部)类型的进程内内存泄漏,包括基于COM的泄漏......
  • Visual Studio 性能探查器排查内存泄漏
    1、自用方法介绍【1】VS使用debug模式执行程序(注意:Release模式无法看到堆栈细节!)【2】截取内存快照2、别人方法介绍【1】首先用vsattach到进程,再点调试–窗口–显示诊断工具。注意:如果用调试–性能探测器去附加进程,则内存使用率这一项是灰的,无法勾选,但是......
  • C++ 动态内存
    C++ 动态内存C++程序中的内存分为两个部分:栈:在函数内部声明的所有变量都将占用栈内存。堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存。很多时候,您无法提前预知需要多少内存来存储某个定义变量中的特定信息,所需内存的大小需要在运行时才能确定。在C++中,您可......
  • 动态分配内存new和delete
    #include<iostream>/*动态分配内存用new关键字,语法:new变量类型(初始值)C++11支持{}newint(5)----申请了一个整型内存,并赋初值为5但是由于动态分配的内存没有变量名,需要用一个指针接着它,操作指针来使用。成功会返回一个地址,不成功返回空地址。......
  • C# 使用共享内存通信
    //SharedMemoryusing(MemoryMappedFilemmf=MemoryMappedFile.CreateOrOpen("sharedmem",500)){ objectobj=newObject(); ManualResetEventmyevent=newManualResetEvent(false); //写入线程每500ms发送一个消息,并发出一次event Threadth_writer=newThre......
  • Delphi和C的类比:指针、字符串、函数指针、内存分配等
    在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一方面加深对Delphi的理解,一方面加深对C/C++的理解,一方面加深对计算机系统的理解,一方面加深对面向对象的理解……由1向多可以......