Linux与JVM的内存关系分析-Java开发Java经验技巧

(19页)

'Linux与JVM的内存关系分析-Java开发Java经验技巧'
Linux与JVM的内存关系分析-编程开发技术Linux与JVM的内存关系分析原文出处:美团技术团队引言在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下: Java服务的JVM堆大小设置为6g, 一个监控进程占用大约600m, Linux 口身使 用人约800m。从衣面上,物理内存应该是足够使用的;但实际运行的情况是, 会发生大量使用SWAP(说明物理内存不够使用了),如下图所示。同时,由于SWAP 和GC同时发生会致使JVM严重卡顿,所以我们要追问:内存究竟去哪儿了?2.33 G1.86 GB1.4 GB953.67 MB476.84 Mpn ?一 4、 uQipn — 4last min avg□ Used swap space [all] 0 B 0 B 321.01 hoom 卜0 90 oorNI 卜0S0 oorNI 卜0寸0 卜o eo oorNI 卜0 00 oorNI 0000min53.79 MElast[all] 128.43 MBID Used swap space要分析这个问题,理解JVM和操作系统Z间的内存关系非常重要。接下來主要就 Linux与JVM之间的内存关系进行一些分析。一、Linux与进程内存模型JVM以一个进程(Process)的身份运行在Linux系统上,了解Linux与进程的 内存关系,是理解JVM与Linux内存的关系的基础。下图给出了硬件、系统、进程三个层面的内存之间的概要关系。从硬件上看,Linux系统的内存空间由两个部分构成:物理内存和SWAP (位于磁 盘)。物理内存是Linux活动时使用的主要内存区域;当物理内存不够使用时,Linux会把一部分暂时不用的内存数据放到磁盘上的SWAP屮去,以便腾出更多 的可用内存空间;而当需要使用位于SWAP的数据时,必须先将其换冋到内存中。从Linux系统上看,除了引导系统的BIN区,整个内存空间主耍被分成两个部分: 内核内存(Kernel space)、用户内存(User space)。内核内存是Linux自身使用的内存空间,主要提供给程序调度、内存分配、连接 硬件资源等程序逻辑使用。用户内存是提供给各个进程主要空间,Linux给各个 进程提供和同的虚拟内存空间;这使得进程Z间和互独立,互不干扰。实现的方 法是采用虚拟内存技术:给每一个进程一定虚拟内存空间,而只有当虚拟内存实 际被使用时,才分配物理内存。如下图所示,对于32的Linux系统來说,一般 将0?3G的虚拟内存空间分配做为用户空间,将3?4G的虚拟内存空间分配为内 核空间;64位系统的划分情况是类似的。32位结构OGB 3GB4GB用户内存64位结构OGB512GB or More用户内存从进程的角度來看,进程能直接访问的用户内存(虚拟内存空间)被划分为5 个部分:代码区、数据区、堆区、栈区、未使用区。代码区屮存放应用程序的机 器代码,运行过程中代码不能被修改,具有只读和固定大小的特点。数据区中存 放了应用程序屮的全局数据,静态数据和一-些常量字符串等,其大小也是固定的。 堆是运行时程序动态申请的空间,属于程序运行时直接申请、释放的内存资源。 栈区用來存放函数的传入参数、临时变量,以及返回地址等数据。未使用区是分 配新内存空间的预备区域。二、进程与JVM内存模型JVM木质就是一个进程,因此其内存模型也有进程的一般特点。但是,JVM又不 是一个普通的进程,其在内存模型上冇许多崭新的特点,主要原因冇两个:1.JVM 将许多本來屈于操作系统管理范畴的东西,移植到了 JVM内部,目的在于减少系 统调用的次数;2?JavaNlO,目的在于减少用于读写10的系统调用的开销。JVM 进程与普通进程内存模型比较如下图:7内核内彳需要说明的是,这个模型的并不是JVM内存使用的精确模型,更侧重于从操作系 统的角度而省略了一些JVM的内部细节(尽管也很重要)。下面从用户内存和内 核内存两个方面讲解JVM进程的内存特点。1 ?用户内存上图特别强调了 JVM进程模型的代码区和数据区指的是JVM 口身的,而非Jewel 程序的。普通进程栈区,在JV\1—般仅仅用做线程栈。JVM的堆区和普通进程的 差别是最大的,下面具体详细说明:首先是永久代。永久代木质上是Java程序的代码区和数据区。Java程序中类(class),会被加载到整个区域的不同数据结构中去,包括常量池、域、方法 数据、方法体、构造函数、以及类小的专用方法、实例初始化、接口初始化等。 这个区域对于操作系统来说,是堆的一个部分;而对于Java程序来说,这是容 纳程序木身及静态资源的空间,使得JVM能够解释执行Java程序。其次是新生代和老年代。新生代和老年代才是Java程序真正使用的堆空间,主 要用于内存对象的存储;但是其管理方式和普通进程有本质的区别。普通进程在运行时给内存对象分配空间时,比如C++执行new操作时,会触发一 次分配内存空间的系统调用,由操作系统的线程根据对彖的大小分配好空间后返 冋;同时,程序释放对彖时,比如C++执行delete操作时,也会触发一次系统 调用,通知操作系统对象所占用的空间已经可以回收。JVM对内存的使用和一般进程不同。JVM向操作系统申请一整段内存区域(具体 大小可以在JVM参数调节)作为Java程序的堆(分为新生代和老年代);当Java 程序中请内存空间,比如执行new操作,JVM将在这段空间中按所需大小分配给 Java程序,并且Java程序不负责通知JVM何吋可以释放这个对象的空间,垃圾 对象内存空间的回收由JVM进行。JVM的内存管理方式的优点是显而易见的,包括:第一,减少系统调用的次数, JVM在给Java程序分配内存空间时不需要操作系统干预,仅仅在Java堆大小变 化时需要向操作系统巾请内存或通知冋收,而普通程序每次内存空间的分配冋收 都需耍系统调用参与;第二,减少内存泄漏,普通程序没有(或者没有及吋)通 知操作系统内存空间的释放是内存泄漏的重要原因之一,而由JVM统一管理,可 以避免程序员带来的内存泄漏问题。最后是未使用
关 键 词:
Linux JVM 内存 关系 分析 Java 开发 经验 技巧
 剑锋文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:Linux与JVM的内存关系分析-Java开发Java经验技巧
链接地址: //www.wenku365.com/p-43709565.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给剑锋文库发消息,QQ:1290478887 - 联系我们

本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有【成交的100%(原创)】。本站是网络服务平台方,若您的权利被侵害,侵权客服QQ:1290478887 欢迎举报。

1290478887@qq.com 2017-2027 //www.wenku365.com 网站版权所有

粤ICP备19057495号 

收起
展开