Java 内存 关系_JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系

在一些具有8g物理内存的服务器上,主要运行Java服务。系统内存分配如下:Java服务的JVM堆大小设置为6g,监视过程大约需要600m,Linux本身使用大约800m。

从表面上看,物理记忆应该足够;但实际操作是会发生大量SWAP(表明物理内存不足),如下图所示。由于同时发生SWAP和GC会导致JVM严重卡住,我们不得不问:内存在哪里?

JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系

要分析此问题,了解JVM与操作系统之间的内存关系非常重要。下一步是对Linux和JVM之间的内存关系进行一些分析。

首先,Linux和进程内存模型

JVM作为Linux系统上的进程运行。了解Linux和进程之间的内存关系是理解JVM和Linux内存之间关系的基础。下图显示了硬件,系统和进程级别的内存之间的摘要关系。

JVM和Linux之间的详细内存关系

从硬件角度来看,Linux系统的内存空间由两部分组成:物理内存和SWAP(在磁盘上)。物理内存是Linux活动使用的主要内存区域;当物理内存不足时,Linux会将一些未使用的内存数据放入磁盘上的SWAP中,以释放更多可用内存空间;使用位于SWAP中的数据时,必须先将其交换回内存。有关JVM运行时区域的详细说明,我建议大家看一下。

从Linux系统来看,除了引导系统的BIN区域外,整个内存空间主要分为两部分:内核内存(Kernel space),用户内存(User space)。

内核内存是Linux本身使用的内存空间。它主要用于程序逻辑,例如程序调度,内存分配和连接硬件资源。

用户内存提供给每个进程的主空间,Linux为每个进程提供相同的虚拟内存空间;这使得这些过程彼此独立,并且不会相互干扰。实现方法是使用虚拟内存技术:为每个进程提供虚拟内存空间,仅在实际使用虚拟内存时分配物理内存。如下图所示,对于32位的Linux系统,0到3G的虚拟内存空间分配通常用作用户空间,3到4G的虚拟内存空间分配为内核空间; 64位系统的划分是类似的。 。

JVM和Linux之间的详细内存关系

从过程的角度来看,进程可以直接访问的用户存储器(虚拟存储空间)分为五个部分:代码区,数据区,堆区,堆栈区和未使用区。

应用程序的机器代码代码存储在代码区域中。代码在运行过程中无法修改,具有只读和固定大小的特征。

数据区存储应用程序中的全局数据,静态数据和一些常量字符串等,其大小也是固定的。

堆是动态应用运行时程序的空间,属于程序运行时直接应用和释放的内存资源。

堆栈区域用于存储传入参数,临时变量和返回地址等数据。

未使用区域是用于分配新存储空间的备用区域。

第二,进程和JVM内存空间

JVM本质上是一个进程,因此它的内存空间(也称为运行时数据区,注意JMM之间的差异)也具有该进程的一般特征。在Java中深入解释JVM内存管理,这个参考。

但是,JVM不是一个普通的进程,它在内存空间中有许多新功能。主要有两个原因:

1. JVM将属于操作系统管理范围的许多东西移植到JVM,以减少系统调用的次数;

2. Java NIO,目的是减少读写IO系统调用的开销。将JVM进程与正常进程内存模型进行比较,如下所示。:

JVM和Linux之间的详细内存关系

应该注意的是,该模型不是JVM内存使用的准确模型,而是从操作系统的角度关注JVM的内部细节(尽管很重要)。下面从两个方面描述JVM进程的内存特征:用户内存和内核内存。

用户记忆

上图突出显示了JVM进程模型的代码区和数据区是指JVM本身,而不是Java程序。正常的进程堆栈区域通常仅用作JVM中的线程堆栈。 JVM堆区域和正常进程之间的差异是最大的,详情如下:

第一个是永久性的一代。永久生成本质上是Java程序的代码和数据区域。 Java程序中的类被加载到整个区域的不同数据结构中,包括常量池,字段,方法数据,方法体,构造函数以及类中的专用方法,实例初始化和接口初始化。该区域是操作系统堆的一部分;对于Java程序,这是容纳程序本身和静态资源的空间,允许JVM解释Java程序的执行。其次是新一代和老年。新一代和老一代是Java程序实际使用的堆空间,主要用于存储对象的存储;但管理方法与普通流程有本质区别。

当正常进程在运行时向内存对象分配空间时,例如,当C ++执行新操作时,它会触发分配内存空间的系统调用,并且操作系统的线程根据对象的大小分配空间,回报;同时,当程序释放对象时例如,当C ++执行删除操作时,它还会触发系统调用,以通知操作系统对象可以回收操作系统对象占用的空间。

JVM对内存的使用与一般过程不同。 JVM将一个完整的内存区域(特定的大小可以在JVM参数中调整)作为一堆Java程序(分为新一代和老一代)应用于操作系统;当Java程序申请内存空间时,例如执行新操作,JVM将在这里。段空间根据所需大小分配给Java程序,并且Java程序不负责在释放对象空间时通知JVM。垃圾对象内存空间由JVM回收。

JVM内存管理方法的优点是显而易见的,包括:首先,减少系统调用的数量,JVM在为Java程序分配内存空间时不需要操作系统干预,只需要向操作系统申请内存当Java堆大小更改时。或者通知回收,每次分配和回收内存空间时,正常程序需要系统调用才能参与;二,减少内存泄漏,正常程序没有(或不及时)通知释放操作系统内存空间是内存泄漏的重要原因之一。并且由JVM管理,可以避免程序员造成的内存泄漏。

最后,有一个未使用的区域,这是一个用于分配新内存空间的备用区域。对于正常进程,此区域可用于堆和堆栈空间请求和释放。该区域用于每个堆内存分配,因此大小经常变化;对于JVM进程,使用堆大小和线程堆栈。这个区域虽然堆大小一般调整较少,所以尺寸相对稳定。操作系统动态调整此区域的大小,并且此区域通常不分配实际物理内存,只允许进程在此区域中应用堆或堆栈空间。

2.内核内存

应用程序通常不直接处理内核内存,内核内存由操作系统管理和使用;然而,由于Linux专注于性能和改进,新功能允许应用程序使用内核内存或映射到内核空间。 Java NIO就是在这种背景下诞生的,它充分利用了Linux系统的新特性,提高了Java程序的IO性能。JVM和Linux之间的详细内存关系

上图显示了Java NIO在Linux系统中使用的内核内存的分布。 Nio缓冲区主要包括:nio在使用各种通道时使用的ByteBuffer,Java程序主动使用ByteBuffer.allocateDirector来申请分配的Buffer。

在PageCache中,nio使用的内存主要包括:FileChannel.map模式打开文件占用映射所需的Cache,FileChannel.transferTo和FileChannel.transferFrom(图中未显示)。

可以通过JMX监视NIO Buffer和映射的使用,如下图所示。但是,FileChannel的实现是通过系统调用使用本机PageCache。该过程对Java是透明的,无法监视这部分内存的使用情况。

JVM和Linux之间的详细内存关系

Linux和Java NIO为程序打开内核内存空间,主要是为了减少不必要的复制,以减少IO操作系统调用的开销。例如,使用常规方法和NIO将数据从磁盘文件发送到网卡时,将比较数据流,如下图所示:

JVM和Linux之间的详细内存关系

在内核内存和用户内存之间复制数据是浪费资源和时间。从上图中,我们可以看到NIO方法减少了内核内存和用户内存之间的数据副本两次。这是Java NIO高性能的重要机制之一(另一种是异步非阻塞)。

从上面可以看出,内核内存对Java程序性能也非常重要。因此,在划分系统内存使用时,必须为内核留出一些空闲空间。

三,案例分析

1.内存分配问题

通过以上分析,省略较小的区域,可以总结JVM占用的内存:

JVM内存≈Java永久代+ Java堆(新一代和老一代)+线程堆栈+ Java NIO

回到本文开头提出的问题,原来的内存分配是:6g(java堆)+ 600m(监控)+ 800m(系统),剩下的600m内存未分配。

现在分析这个600m内存的分配:

Linux保留了大约200米,这是Linux正常运行的必要条件。

Java服务的线程数为160.JVM的默认线程堆栈大小为1m,因此使用160m内存。Java NIO缓冲区,JMX最长可达200米。

Java服务使用NIO大量读写文件,您需要使用PageCache。如前面的分析所述,这不是一个好的定量估计。

前三项总计达560米,因此您可以得出Linux物理内存不足的结论。

细心的人会发现这两个服务器在介绍中给出。一个SWAP最多占用2.16g,另一个SWAP占用871m。然而,似乎我们的记忆差距并不大。实际上,这是由于同时实施SWAP和GC。从下图中可以看出,SWAP的使用与长期GC同时发生。

JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系

SWAP和GC的同时发生将导致GC时间长,严重的JVM以及极端的服务崩溃。原因如下:当JVM执行GC时,需要遍历相应堆分区的已用内存;如果GC,堆的某些部分交换到SWAP,并且在遍历到此部分时需要将其交换回内存。同时,由于内存空间不足,有必要将内存中堆的另一部分切换为SWAP;在遍历堆分区的过程中,(在极端情况下)整个堆分区将依次写入SWAP。 Linux对SWAP的恢复滞后,我们将看到很多SWAP用法。可以通过减小堆大小或增加物理内存来解决上述问题。

因此,我们得出结论,部署Java服务的Linux系统需要避免在内存分配中使用SWAP;如何分配它取决于JVM for Java permanent generation和Java heap(新一代和老一代)在不同的场景中。 ,线程堆栈和Java NIO的内存使用情况。

2.内存泄漏问题

另一种情况是8g内存服务器,Linux使用800m,监控进程使用600m,堆大小设置为4g;系统可用内存约为2.5g,但很多SWAP也被占用。

对此问题的分析如下:

1在这种情况下,Java永久生成,Java堆(新一代和老一代),线程堆栈使用的内存基本上是固定的,因此占用过多内存的原因位于Java NIO上。

2根据以前的模型,Java NIO使用的内存主要分布在Linux内核内存的System区域和PageCache区域。查看监控记录,如下图所示,我们可以看到在SWAP发生之前,也就是说,当物理内存不足时,PageCache会急剧缩小。因此,位于系统区域的Java NIO缓冲区中可能会发生内存泄漏。JVM和Linux之间的详细内存关系

JVM和Linux之间的详细内存关系

3由于NIO的DirectByteBuffer需要稍后在GC中回收,因此连续申请DirectByteBuffer的程序通常需要调用System.gc()以避免FullGC长期失效导致旧区域中的DirectByteBuffer内存泄漏。在分析了这一点之后,可以推断出有两个可能的原因:首先,Java程序在必要时不调用System.gc();第二,System.gc()被禁用。

4最后,有必要检查JVM启动参数和Java程序的DirectByteBuffer用法。在此示例中,查看JVM启动参数并发现启用-XX: + DisableExplicitGC会导致System.gc()被禁用。

上一篇: 没有了

下一篇: 没有了

分享到:

8a7a8a2a91c2375951ff59429107623c.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500212.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java遍历删除原理,Java 垃圾回收机制实现原理

一、垃圾回收机制的意义Java语言中一个显著的特点就是引入了垃圾回收机制,使c程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念&…

matlab简易编程,MATLAB简单编程

本帖最后由 wanggh 于 2016-12-5 14:47 编辑用数值差分、SOR迭代法求雷诺方程和用牛顿迭代法求解轴向柱塞泵滑靴副压力场的算法,%油膜厚度场、压力场迭代 MATLAB只认弧度制,不认角度制clear all; % (60rpm1rad/s)wg1000; %1000…

php删除字段某个字段,php数如何组删除某个字段

【摘要】PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。下面是php数如何组删除某个字段,让我们一起…

php重复点击按钮无效,完美解决UIButton按钮重复点击、多次响应的问题

最近测试老跑过来提bug,说按钮可以点好几次,然后蹦出来好几个一样的界面出来,解决了一个地方,其他地方也会冒出一样的问题来,仔细一想,还是要从根本上解决问题,于是想了几个方法:1.添…

matlab画地震复杂模型,基于MATLAB的地震正演模型实现

总 第 237 期2009 年 第 7 期计 算 机 与 数 字 工 程 37 7132  基 于 L 地 震 正 演 模 型 实 现 3贾 跃 玮 1)   杨   锐 2)(中 国 地 质 大 学 地 下 信 息 探 测 技 术 与 仪 器 教 育 部 重 点 实 验 室 1)   北 京   100083)(川 庆 钻 探 工 程 有 限 公 司 地 质 …

用matlab抽样定理验证,MATLAB抽样定理验证.docx

MATLAB抽样定理验证.docx目的通过 MATLAB 编程实现对时域抽样定理的验证,加深抽样定理的理解。同时训练应用计算机分析问题的能力。任务连续信号 ftcos8*pi*t2*sin40*pi*tcos24*pi*t,经过理想抽样后得到抽样信号 fst,通过理想低通滤波器后重构…

ios java 图片上传到服务器,iOS 图片上传服务器

最近搞图片上传,折腾了一个星期终于做出来了,网上搜出来的方法几乎都是好几年前的,试了好多都不能用,此次把代码公布出来供大家参考。注:部分代码是后台写的,此方法没用到第三方库。1.图片保存到本地同时上…

matlab判断能控和能观,实验三 利用Matlab分析能控性和能观性

实验三 利用Matlab分析能控性和能观性实验目的:熟练掌握利用Matlab中相关函数分析系统能控能观性、求取两种标准型、系统的结构分解的方法。实验内容:1、能控性与能观性分析中常用的有关Matlab函数有:Size(a,b) 获取矩阵的行和列的数目Ctrb(a…

JAVA table word,实战 | Java读取Word,包含表格!

本文转载自微信公众号「JAVA日知录」,作者单一色调。转载本文请联系JAVA日知录公众号。不能每天都发鸡汤呀,今天分享一篇开发实战。业务需求我们有这样一个需求,需要抽取出WORD文档中的内容,然后组装成特定的json格式发送给第三方…

基于matlab的频域辨识,基于Lab VIEW的控制系统频域分析研究

在系统设计和构成之前,必须对系统进行分析、综合和预测研究,从而得出系统的性能评价指标,如控制精度、响应速度和系统稳定性等。一般来说,我们可以从两个方面来对系统的性能进行分析,一是时域,二是频域,它们是从不同的侧面,以被研究系统的传递函数为依据,来研究系统的特性,关于…

php培训出生做微电影网站的,微电影分享网站织梦整站源码

使用说明:1、模板在目录下【themes】-【default】文件夹中2、logo等图片在【statics】-【images】中安装教程:1、传到空间,由于有很多人反应安装后首页样式都乱的,(强烈要求安装到根目录,如:127.0.0.1 / ww…

mysql分列查询,Mysql导出问题,乱码问题,为分列问题解决!!!

前言:本文可以先阅读完再跟着做。Mysql查询出的数据导出为csv最近遇到同学的一个需求,要求差寻一些数据然后导出给他,因为之前也有做过类似的事情,觉得可以一下就搞定,但是居然出现乱码又出现没有分列的情况&#xff0…

微信你scope 参数错误 php,微信开发: scope参数错误或没有scope权限解决方法

scope为snsapi_userinfo 未关注者点击授权提示 scope参数错误或没有scope权限解决方法出现这种错误网上查出现有的原因是:订阅号没有相关的权限账号没有认证,没有相关的权限那么这里遇到问题两种都不是。开发账号是 服务号,而且也是认证号。解决方法:错…

oracle什么时候用in,Oracle Study之---Oracle IN和NOT IN的使用

Oracle Study之---Oracle IN和NOT IN的使用NOT IN 与 IN 的区别:------------------------------------------------------------------------------------------------------not In 相当于<> all,如果 Not In 后面跟的是子查询的话&#xff0c;子查询中只要包含一个 nu…

oracle中having作用,oracle中having与where的区别

1、where 不能放在group by 的后面2、HAVING 是跟GROUP BY 连在一起用的&#xff0c;放在GROUP BY 后面&#xff0c;此时的作用相当于WHERE3.WHERE 后面的条件中不能有聚集函数&#xff0c;比如SUM(),AVG()等&#xff0c;而HAVING 可以where 条件group by 某个或某几个字段gro…

linux系统支持u盘格式,linux下U盘格式化

第一步&#xff0c;手动将挂在的U盘分区卸载&#xff1a;umount /dev/sdbumount /dev/sdb1第二步&#xff0c;准备格式化U盘&#xff0c;这里要提一句&#xff0c;U盘要被格式化成为fat格式&#xff0c;而用到的命令是mkfs.vfat这个命令要注意&#xff0c;根据你要格式化分区格…

Linux怎么查看保存的密码,在Linux中查看已保存的WiFi密码

在安装流行操作系统时&#xff0c;如 Windows 10、Ubuntu、macOS 等&#xff0c;都会要求用户提前输入 WiFi 密码。特别是 Ubuntu 系统&#xff0c;在配置安装向导时就可以连接 WiFi&#xff0c;以方便在系统安装过程就从网络获取最新更新&#xff0c;并在安装完成后就为用户提…

怎么判断linux22端口是否通,在Linux环境下使用SSH判断端口是否通(示例代码)

在Linux环境下使用SSH判断端口是否通在windows/linux环境下&#xff0c;可以使用telnet判断端口状态&#xff0c;但有时候在Linux环境下没有telnet&#xff0c;所以可以使用ssh判断端口状态。一、ssh使用方法&#xff1a;命令&#xff1a;ssh -v -p port [email protected]说明…

linux磁盘管理的命令行,Linux磁盘管理命令介绍

fdisk [options] device常用选项有&#xff1a;d删除一个分区n创建一个分区p显示分区信息t修改分区的系统idw保存分区表并推出q退出不保存创建分区时&#xff0c;如果分区数目大于4个&#xff0c;就要建立扩展分区&#xff0c;如果没有把全部磁盘容量给扩展分区&#xff0c;那…

linux 网卡 巨帧,Linux Kernel e1000e驱动巨型帧处理绕过安全检查漏洞

发布日期&#xff1a;2009-12-29更新日期&#xff1a;2010-01-13受影响系统&#xff1a;Linux kernel 2.6.32.3描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 37523CVE(CAN) ID: CVE-2009-4538Linux Kernel是…