Linux与JVM的内存关系.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux与JVM的内存关系 2021-09-15 引言 在一些物理内存为8g的服务器上,次要运转一个Java服务,系统内存安排如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约600m,Linux本身使用大约800m。从表面上,物理内存应当是足够使用的;但实际运转的情况是,会发生大量使用SWAP(说明物理内存不够使用了),如下图所示。同时,由于SWAP和GC同时发生会致使JVM严峻卡顿,所以我们要诘问:内存到底去哪儿了? 要分析这个问题,理解JVM和操作系统之间的内存关系格外重要。接下来次要就Linux与JVM之间的内存关系进行一些分析。 一、Linux与进程内存模型 JVM以一个进程(Process)的身份运转在Linux系统上,了解Linux与进程的内存关系,是理解JVM与Linux内存的关系的基础。? 下图给出了硬件、系统、进程三个层面的内存之间的概要关系。 从硬件上看,Linux系统的内存空间由两个部分构成:物理内存和SWAP(位于磁盘)。物理内存是Linux活动时使用的次要内存区域;当物理内存不够使用时,Linux会把一部分临时不用的内存数据放到磁盘上的SWAP中去,以便腾出更多的可用内存空间;而当需要使用位于SWAP的数据时,必需先将其换回到内存中。 从Linux系统上看,除了引导系统的BIN区,整个内存空间次要被分成两个部分:内核内存(Kernel space)、用户内存(User space)。? 内核内存是Linux本身使用的内存空间,次要供应应程序调度、内存安排、连接硬件资源等程序规律使用。用户内存是供应应各个进程次要空间,Linux给各个进程供应相同的虚拟内存空间;这使得进程之间相互独立,互不干扰。实现的方法是接受虚拟内存技术:给每一个进程肯定虚拟内存空间,而只要当虚拟内存实际被使用时,才安排物理内存。 对于32的Linux系统来说,一般将0~3G的虚拟内存空间安排做为用户空间,将3~4G的虚拟内存空间安排为内核空间;64位系统的划分情况是类似的。 从进程的角度来看,进程能直接访问的用户内存(虚拟内存空间)被划分为5个部分:代码区、数据区、堆区、栈区、未使用区。代码区中存放应用程序的机器代码,运转过程中代码不能被修改,具有只读和固定大小的特点。数据区中存放了应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。堆是运转时程序动态申请的空间,属于程序运转时直接申请、释放的内存资源。栈区用来存放函数的传入参数、临时变量,以及前往地址等数据。未使用区是安排新内存空间的预备区域。 二、进程与JVM内存模型 JVM本质就是一个进程,因而其内存模型也有进程的一般特点。但是,JVM又不是一个一般的进程,其在内存模型上有很多簇新的特点,次要缘由有两个: 1. JVM将很多原来属于操作系统管理范畴的东西,移植到了JVM内部,目的在于削减系统调用的次数; 2. Java NIO,目的在于削减用于读写IO的系统调用的开销。? JVM进程与一般进程内存模型比较如下图: 需要说明的是,这个模型的并不是JVM内存使用的精确模型,更侧重于从操作系统的角度而省略了一些JVM的内部细节(虽然也很重要)。下面从用户内存和内核内存两个方面讲解JVM进程的内存特点。 1. 用户内存 上图特殊强调了JVM进程模型的代码区和数据区指的是JVM本身的,而非Java程序的。一般进程栈区,在JVM一般仅仅用做线程栈。JVM的堆区和一般进程的差别是最大的,下面具体具体说明: 首先是永久代。永久代本质上是Java程序的代码区和数据区。Java程序中类(class),会被加载到整个区域的不同数据结构中去,包括常量池、域、方法数据、方法体、构造函数、以及类中的公用方法、实例初始化、接口初始化等。这个区域对于操作系统来说,是堆的一个部分;而对于Java程序来说,这是容纳程序本身及静态资源的空间,使得JVM能够解释执行Java程序。 其次是重生代和老年月。重生代和老年月才是Java程序真正使用的堆空间,次要用于内存对象的存储;但是其管理方式和一般进程有本质的区分。? 一般进程在运转时给内存对象安排空间时,比如C++执行new操作时,会触发一次安排内存空间的系统调用,由操作系统的线程依据对象的大小安排好空间后前往;同时,程序释放对象时,比如C++执行delete操作时,也会触发一次系统调用,通知操作系统对象所占用的空间已经可以回收。? JVM对内存的使用和一般进程不同。JVM向操作系统申请一整段内存区域(具体大小可以在JVM参数调整)作为Java程序的堆(分为重生代和老年月);当Java程序申请内存空间,比如执行new操作,JVM将在这段空间中按所需大小安排给Java程序,并且Java程序不担任通知JVM何时可以释放这个对象

文档评论(0)

bob157641554 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档