java9 堆外内存_java堆外内存泄漏排查

当考虑Java中的内存泄漏时,我们通常会考虑Java堆泄漏,即在堆中分配的对象没有被垃圾收集。这是我在处理一台服务器内存泄漏时的想法,但我即将经历的远超出我的想象。

症状:运行Vertx应用程序(没有交换分区)的生产服务器被Linux内存不足kill掉(操作系统机制,当系统出现内存紧张的情况时释放内存)崩溃。

因为它是生产服务器,所以我认为可以让我们使用堆转储和MAT来检查发生了什么,并尝试找出谁在消耗这么多内存。

结果令人惊讶,java堆是合理的,远远少于进程内存的足迹。有什么东西侵蚀了我的内存,我不知道那是什么。

我的出发点是在home目录中创建的java致命错误日志,所以我开始研究这些日志。您可以在下面的页面中关于java致命错误日志的信息:致命错误日志致命错误日志可以提供很多有价值的信息并节省时间,因此我建议您仔细阅读。致命错误日志显示堆大小小于2G,但进程正在增长到大约3-4G字节,这是怎么回事?

Java进程包含以下内存空间:

堆-分配对象的位置。

线程堆栈-包含所有线程堆栈。

Metaspace-包含元数据类(替换Java7和更早版本中的PermGen)。

代码缓存-JIT编译器代码缓存。

堆缓冲池不足。

操作系统内存-本机操作系统内存。

我用了命令:

jmap -heap [pid]

它打印了JVM堆大小的摘要,还显示了堆大小约为1.5GByte。

我检查了元空间的大小,但只有几兆字节。也许代码缓存是问题所在?我再次检查了致命错误日志,我看到只有大约20M。我得出的结论是,可能我有本机内存泄漏即-XX:NativeMemoryTracking=detail,然后使用jcmd实用程序(包含在JDK中)检查本机内存。在下一页中阅读有关NMT的更多信息:NMT结果包含以下内容:

Internal (reserved=1031767KB, committed=1031767KB)

(malloc=1031735KB #7619)

(mmap: reserved=32KB, committed=32KB)

我发现JVM有大约1Gbyte大小的内存。现在我确信我有

我发现有巨大的malloc(操作系统内存分配调用)内存分配,但我仍然不知道是什么原因造成的。我试着用gdb处理内存转储,但效果不好,我得出的结论是它可能不会有用,所以我搜索了Linux内存泄漏检测工具。我有几个候选人:

Valgrind

malloc_tracer

前两个由于某些原因不起作用,所以尝试了人们推荐的jemalloc。我在应用程序启动脚本中添加了以下行:

MALLOC_CONF=prof_leak:true,prof_final:true,lg_prof_interval:30,lg_prof_sample:17 \

LD_PRELOAD=/usr/local/lib/libjemalloc.so.2 [jre path]/jre/bin/java [app parameters]

一开始jemalloc不起作用,我不得不用configure参数-enable prof重新编译它,然后它就开始工作了。关闭应用程序后,jemalloc在工作目录中创建了reproof文件。

[jemalloc install dir]/bin/jeprof --show_bytes --pdf ‘[jre path]/jre/bin/java' [jeprof file] > [pdf output file name]

e0aee81b9b69f9f378fe112e82f04bcd.png

jemalloc分析表明,使用malloc os调用分配内存的“Unsafe_AllocateMemory”存在严重泄漏。我原以为我现在就能得到答案,但显然我错了。我在谷歌上搜索了一下,发现不安全的分配内存可能与名为sun.misc.Unsafe是执行本机内存分配的JDK私有类,正如它的名称所表明的那样,它是不安全的(Oracle计划在java9中删除这个类,但最终它仍保留在不受支持的模块中)。我搜索了应用程序代码,但没有找到它的任何用法,我假设它可能是应用程序的一些库使用的。主要嫌疑人是Netty,Netty是Vertx使用的网络库。Netty提供了很好的性能,但它使用本机内存分配来实现这一点。在Netty源代码中挖掘发现它正在使用`sun.misc.Unsafe`分配本机内存池。Netty包含内存泄漏检测机制,因此我尝试使用Netty参数:

-Dio.netty.leakDetection.level=advanced But that dind't supply any output.

我试着通过使用其他netty参数(没有很好的文档)来限制netty:

-Dio.netty.noPreferDirect=true

-Dio.netty.allocator.type=unpooled

-Dio.netty.maxDirectMemory=0

但这也不管用。

经过多次尝试,我最终发现直接内存分配可以通过以下jvm参数来限制:

-XX:MaxDirectMemorySize=[max memory]

在深入研究jvm之后,我终于找到了解决方案。我学到了很多关于jvm机制和内存空间的知识。ff9c546f2075937ba624f33a85038b7f.png

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

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

相关文章

[2020-CVPR] Dynamic Region-Aware Convolution 论文简析

[2020-CVPR] Dynamic Region-Aware Convolution 论文简析 论文地址:https://arxiv.org/abs/2003.12243 参考代码地址(非官方):https://github.com/shallowtoil/DRConv-PyTorch 代码笔者自己试了一下,应该是可以的&…

mmdetection 使用笔记 01: 安装与简单的推理demo

mmdetection 使用笔记 01: 安装与简单的推理demo mmdetection是来自商汤和港中文联合实验室openmmlab推出的目标检测工具包,与其同系列的还有基础视觉包mmcv,图像分类mmclassification,还有mmaction,mmaction2等等。 今天第一次…

php无限评论回复_php实现无限级评论功能_后端开发

php去除数组的键名的方法_后端开发在php中可以使用“array_values()”函数去除数组的键名,该函数返回包含数组中所有的值的数组,其语法是“array_values(array)”,其参数“array”表示规定的数组,返回值是包含数组中所有的值的数组…

错误类型、混淆矩阵及目标检测常用评价指标

目标检测常用评价指标 本文主要参考陈恺大佬在B站商汤账号的介绍mmdetection的视频。 检测结果的正确/错误类型 真阳性(Ture Positive):算法检测到了某类物体(Positive),而实际图中也确实有这个物体&…

使用yolov5训练自己的目标检测数据集

使用yolov5训练自己的目标检测数据集 yolov4出来后不久,又出现了yolov5,没有论文。虽然作者没有放上和yolov4的直接测试对比,但在COCO数据集的测试效果还是很可观的。很多人考虑到YOLOv5的创新性不足,对算法是否能够进化&#xf…

php获取h1,jQuery获取h1-h6标题元素值方法实例

本文主要介绍了jQuery实现获取h1-h6标题元素值的方法,涉及$(":header")选择器操作h1-h6元素及事件响应相关技巧,需要的朋友可以参考下,希望能帮助到大家。1、问题背景:查找到h1-h6,并遍历它们,打印出内容2、实现代码&am…

[2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析

[2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析 论文:https://arxiv.org/abs/2104.00323 代码:https://github.com/dvlab-research/JigsawClustering 总结 本文提出了一种单批次&#xff0…

matlab legend 分块,matlab legend 分块!

matlab legend 分块!(2013-03-26 18:07:38)%%%压差clc;clear all;figure(55);set (gcf,Position,[116 123 275 210],color,w);P[25 26 27 28 29 30 31 32 33 34 35];%理论q0.00006*pi*28*P*10^(6)*0.03^3/(12*0.028448*5);q1110.00006*pi*28*P*10^(6)*0.03^3/(12*0.…

利用opencv-python绘制多边形框或(半透明)区域填充(可用于分割任务mask可视化)

利用opencv-python绘制多边形框或(半透明)区域填充(可用于分割任务mask可视化) 本文主要就少opencv中两个函数polylines和fillPoly分别用于绘制多边形框或区域填充,并会会以常见用途分割任务mask(还是笔者…

Positional Encodings in ViTs 近期各视觉Transformer中的位置编码方法总结及代码解析 1

Positional Encodings in ViTs 近期各视觉Transformer中的位置编码方法总结及代码解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单。对其做各种改进的顶会论文也是层出不穷,本文将聚焦于各种最新的视觉trans…

mysql 分析查询语句,MySQL教程之SQL语句分析查询优化

怎么获取有功能问题的SQL1、经过用户反应获取存在功能问题的SQL2、经过慢查询日志获取功能问题的SQL3、实时获取存在功能问题的SQL运用慢查询日志获取有功能问题的SQL首要介绍下慢查询相关的参数1、slow_query_log 发动定制记载慢查询日志设置的办法,能够经过MySQL指…

树莓派摄像头基础配置及测试

树莓派摄像头基础配置 step 1 硬件连接 硬件连接,注意不要接反了,排线蓝色一段朝向网口的方向。(笔者的设备是树莓派4B) step 2 安装raspi-config 安装 raspi-config raspi-config在raspbian中是预装的,而在kali、…

使用百度云智能SDK和树莓派搭建简易的人脸识别系统 Python语言版

硬件 树莓派4B一个CSI摄像头一个 笔者使用的是树莓派4B和CSI摄像头,但是树莓派3和USB摄像头等相似设备均可。 百度云智能设置 Step 1 登录 百度云智能 网址https://cloud.baidu.com/ 首先登录百度账号,与百度云、百度贴吧等互通,可直接…

xp搭建 php环境,windows xp 下 LAMP环境搭建

1. apache安装步骤如下图在浏览器中输入:localhost,出现下面页面说明已成功安装apache。2. mysql安装如下图显示在运行里面输入cmd ,然后连接测试mysql ,如图所示:3. php安装(1)将php压缩包解压到安装路径中的php目录…

C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

C中的虚函数(表)实现机制以及用C语言对其进行的模拟实现 声明:本文非博主原创,转自https://blog.twofei.com/496/,博主读后受益良多,特地转载,一是希望好文能有更多人看到,二是为了日后自己查阅。 前言 …

C++中数组和指针的关系(区别)详解

C中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际上代表数组的起始地址,这意味着数组名称实际上就是…

安装php独立环境,0507-php独立环境的安装与配置 Web程序 - 贪吃蛇学院-专业IT技术平台...

1.在一个纯英文目录下新建三个文件夹2.安装apache(选择好版本)过程中该填的按格式填好,其余的只更改安装目录即可如果报错1901是安装版本的问题。检查:安装完成后localhost打开为It works!添加到电脑属性环境变量:3.将php文件解压文档放到AMP…

linux中PATH变量-详细介绍

转自:https://blog.csdn.net/haozhepeng/article/details/100584451 转载者勘误 原文最后提到的 echo 命令对于环境变量的修改无影响。这是肯定的,echo 命令相当于只是一个打印的函数(比如 Python 中的 print)。这里要修改环境变…

php assert eval,代码执行函数之一句话木马

前言大家好,我是阿里斯,一名IT行业小白。非常抱歉,昨天的内容出现瑕疵比较多,今天重新整理后再次发出,修改并添加了细节,另增加了常见的命令执行函数如果哪里不足,还请各位表哥指出。eval和asse…

显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理

显卡、显卡驱动、CUDA、CUDA Toolkit、cuDNN 梳理 转自:https://www.cnblogs.com/marsggbo/p/11838823.html#nvccnvidia-smi GPU型号含义 显卡: 简单理解这个就是我们前面说的GPU,尤其指NVIDIA公司生产的GPU系列,因为后面介绍的…