首页 > 系统相关 >【Java基础】物理内存&虚拟内存

【Java基础】物理内存&虚拟内存

时间:2024-10-19 21:48:49浏览次数:9  
标签:Java 内存 JVM 磁盘 虚拟内存 物理

前言

在 Java 程序运行过程中,操作系统为其分配了物理内存和虚拟内存。理解这两者的概念有助于明晰内存管理和性能优化。

一、物理内存

物理内存是指计算机的实际 RAM(随机存取存储器)。Java 进程在运行时需要向操作系统请求内存资源,操作系统通过分配物理内存来满足 Java 进程的内存需求。
简而言之,物理内存是计算机系统的一种存储介质和磁盘不同、容量相对较小,通常在几GB到几十GB之间,常常用于临时数据存储。JVM 在堆内存、栈内存等区域中分配的内存实际上会映射到物理内存。

二、虚拟内存

虚拟内存是操作系统的一种内存管理机制,它允许应用程序看到的内存地址空间远大于物理内存。虚拟内存结合了 RAM 和磁盘(通常是交换空间 swap)的存储资源,将其作为一个大的统一内存空间对外暴露。
JVM 和应用程序看到的是虚拟地址空间,而非直接访问物理内存。
虚拟内存通过分页(paging)机制管理,将物理内存和磁盘上的页面文件结合使用。当物理内存不足时,操作系统会将不常用的内存页面换出到磁盘,并在需要时从磁盘换入。
简而言之,虚拟内存会指向物理内存或者磁盘,当JVM处理的数据处于磁盘上时,JVM会将磁盘中的数据load进入物理内存。物理内存不足时,将内存中不需要处理的数据放入磁盘中。

三、Java内存模型

  • 堆(Heap):这是 Java 应用程序使用的主要内存区域,用于存放对象。堆的大小可以通过 JVM 参数 -Xms 和 -Xmx 来设置。堆内存被操作系统映射到虚拟地址空间,具体的内存页会在运行时根据需要分配到物理内存。
  • 非堆内存(Non-Heap Memory):包括元空间(Metaspace)、代码缓存、直接内存等区域。它们用于存储类信息、常量、JIT 编译的代码等。这部分内存也消耗虚拟内存。
  • 栈(Stack):每个线程都有自己的栈内存,用于存储局部变量和方法调用栈帧。栈的大小可以通过 JVM 参数 -Xss 来设置。栈也是分配在虚拟内存中的。
  • 直接内存(Direct Memory):这是由 NIO(New I/O)库使用的内存区域,允许 Java 直接从堆外分配内存,用于更高效地进行 I/O 操作。直接内存不是分配在堆上,但消耗的是虚拟内存,大小可以通过 -XX:MaxDirectMemorySize 来配置。

四、总结与反思

物理内存和虚拟内存的区别在于前者是实际的内存资源,后者是操作系统通过映射创建的逻辑空间。

五、附录

1. 有虚拟内存为什么Java进程还会OOM?

堆内存不足

Java 应用程序的堆内存是由 JVM 管理的,虚拟内存并不意味着可以无限制地分配堆内存。如果应用程序请求的堆内存超过了 JVM 设置的最大堆大小(通过 -Xmx 配置),即使系统有足够的虚拟内存,JVM 也会抛出 OOM。

元空间不足

从 Java 8 开始,元空间用于存储类的元数据,元空间大小不是固定的。如果动态加载了大量类而未配置足够的元空间,可能会导致 OOM。这与虚拟内存的可用性无关。

直接内存不足

直接内存(通过 NIO 使用)是堆外分配的内存。如果应用程序需要大量直接内存并且未配置足够的最大直接内存(-XX:MaxDirectMemorySize),也会引发 OOM。

总结

虚拟内存虽然提供了扩展的地址空间,但 Java 进程的内存管理依然受到堆、元空间和直接内存等限制的影响。
简而言之,虚拟内存解决了计算过程将所有数据load到内存的困境,但是仍然受限于物理内存。
举个例子:写一个程序计算 a+b+c, 虚拟内存可以load a+b,然后再将计算结果x + c,保证内存中不会将不需要此刻处理的数据load到内存。
但是,对于JVM运行过程中正在使用的数据,仍然需要load到物理内存中。

标签:Java,内存,JVM,磁盘,虚拟内存,物理
From: https://www.cnblogs.com/wxmai/p/18486635

相关文章

  • java锁的问题速通
     1.syncronized底层原理——悲观锁synchronized有对象锁和类锁两种,多个线程中只有一个线程可以获取对象锁,其他线程都会处于阻塞状态synchronized是底层是基于monitor实现的。monitor是C++编写的jvm对象,主要分为owner(这个只会存一个线程的信息,记录当前锁被哪个线程获取了)、ent......
  • java反射机制
    什么是java反射呢,先来看Oracle官方的解释:“ReflectionenablesJavacodetodiscoverinformationaboutthefields,methodsandconstructorsofloadedclasses,andtousereflectedfields,methods,andconstructorstooperateontheirunderlyingcounterparts,......
  • [Java基础] 异常处理机制
    往期回顾[Java基础]基本数据类型[Java基础]运算符[Java基础]流程控制[Java基础]面向对象编程[Java基础]集合框架[Java基础]输入输出流[Java基础]异常处理机制[Java基础]Lambda表达式目录什么是异常处理?异常分类检查型异常非检查型异常(UncheckedExcepti......
  • java计算机毕业设计springboot+vue小区物业管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着城市化进程的加速,住宅小区的规模不断扩大,小区内的管理事务日益繁杂。传统的物业管理方式依赖人工操作,效率低下且容易出错。在信息技术飞速发......
  • java计算机毕业设计广告系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、研究背景随着互联网的迅猛发展,广告行业发生了翻天覆地的变化。广告形式和载体日益多样化,从传统的报纸、杂志、电视到如今无处不在的互联网广告等1。海量......
  • java基于springboot的在线教学平台(源码+vue+部署文档+前后端分离等)
    收藏关注不迷路!!......
  • Java虚拟机(JVM)(7)—— 垃圾回收(1)
    文章目录前言一、方法区的回收二、垃圾判别阶段算法1、引用计数法2、可达性分析算法GCRoots对象三、常见的引用对象1、强引用2、软引用软引用的使用方法3、弱引用4、虚引用和终结器引用四、垃圾回收算法1、垃圾回收算法的评价标准2、标记清除算法3、复制算法3、......
  • 深度讲解Java中的面对象,通俗易懂
    目录1.封装(Encapsulation)2.继承(Inheritance)3.多态(Polymorphism)4.抽象(Abstraction)总结在Java中,“面向对象编程”(Object-OrientedProgramming,简称OOP)是核心概念之一。它通过使用类和对象来组织代码,允许程序员创建可以模拟现实世界事物的代码结构。Java中的面向对象编......
  • 基于Java数据库管理系统的毕业设计论文
    摘要数据库管理系统是一个快速分析数据、方便管理者管理所有数据的后台操作系统,所以将传统的图书管理方式彻底的解脱出来,可以提高管理员的工作效率,减轻管理员以往繁忙的工作,减小出错的概率。从而使人们有更多时间来获取信息、了解信息、掌握信息。数据库的开发主要包括后台......
  • 【最新Java必过毕设选题】基于SSM的医院门诊互联电子病历管理信息系统(源码+万字LW+答
    作品简介 Hi,各位同学好呀!今天向大家分享一个最新完成的高质量毕业设计项目作品基于SSM的XXX管理系统项目评分(最低0分,满分5分)难度系数:3分工作量:5分创新点:3分界面美化:5分使用技术前端:html/js/css/vue后端:ssm数据库:MySql服务器:apache-tomcat编译器:Int......