当前位置: 首页 > news >正文

JVM内存管理

Java语言的内存不需要程序员自己申请与销毁,不像CPP的内存需要自己申请,但是出现的问题就是JVM出现问题,不想CPP能通过修改程序改变。

本质上JVM就是用来模拟物理机,因此内部的构成也基本与相关物理机的构成类似,含有程序计数器等。

程序计数器,记录的是当前线程执行字节码指令的行号,在解释器执行指令时不断指向下一个字节码指令。Java的多线程使用时间片轮转算法,当轮转到下一个线程执行时,本线程的程序计数器就会保存当前执行到的字节码行号。

虚拟机栈,每个方法被执行时都会创建栈帧,栈帧包含的方法的一些信息,将其压入虚拟机栈,栈帧中还保存了一个指向当前方法的运行时常量池,需要调用其他方法时就在常量池中找到符号引用转化为直接引用去调用对应的方法。

通常栈底都是main方法,方法之间的调用才会导致压栈,本地方法栈就是供本地方法使用的栈,和虚拟栈类似。栈具有大小限制,不可能无限压栈,因此通常无限递归栈就会崩溃。

以下是Java 

堆,JVM内存中最大的一块空间,用来管理和存储对象,垃圾回收机制也主要作用与堆。

方法区运行时常量池就是相关的常量保存的地方,例如String字符串直接赋值与新建对象传入字符串的构造函数不一样,一个指向方法区中的常量池,一个指向堆区,但是内容本质上相同并且都在常量池。

本质上内存是由容量限制的,虽然是虚拟的但是也会发生爆内存这样的问题,堆和虚拟栈都会爆。

申请堆外内存,JVM可以通过调用CPP中的函数或malloc进行申请内存,这个内存不在虚拟机之中,而是在物理机上,因此需要我们主动释放,堆外内存操作类:Unsafe,无法直接获得,本质上就是不安全且不建议使用的,只能通过反射拿出该类,使用方法如下,但是堆外内存操作时更加有效率。

相关文章:

  • 线程池的工作流程
  • VMware如何配置IP网络
  • java数据结构_Map和Set(一文理解哈希表)_9.3
  • 探索Elasticsearch:文档的CRUD
  • DeepSeek-OpenSourceWeek-第六天-Inference System Overview
  • Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
  • Qt基础入门-详解
  • Linux配置虚拟机
  • AMD RDNA3 GPU架构解析
  • Oracle数据库安全防护体系构建与核心技术解析
  • Excel的行高、列宽单位不统一?还是LaTeX靠谱
  • 厦门大学DeepSeek系列报告2份,《大模型概念、技术与应用实践》、《DeepSeek大模型赋能高校教学和科研》
  • 【软件安装】WebStorm现在免费,但是是非商业版本
  • 鸿蒙app 开发中如何计算两个点 之间的距离
  • 用工厂函数简化redis配置
  • 《Python编程调用本地部署大模型llava:7b :人工智能如何帮助医生诊断疾病》
  • 【PTA】1016 部分A+B
  • 我如何开发 Doc Java工具,简化文档模板生成
  • Hi3516DV300——Taurus开发环境搭建
  • About HP.FocusMode
  • 全国共有共青团员7531.8万名,共青团组织439.7万个
  • 挑大梁!一季度北上广等7省份进出口占外贸总值四分之三
  • 从“土”到“潮”,唢呐何以“圈粉”年轻人
  • 阿曼外交部:美伊谈判因故推迟
  • 韩国代总统、国务总理韩德洙宣布辞职,将择期宣布参选总统
  • 两部门发布“五一”假期全国森林草原火险形势预测