Java线程:保留的内存分析

本文将为您提供一个教程,使您可以确定活动应用程序Java线程保留Java堆空间的数量和位置。 将提供来自Oracle Weblogic 10.0生产环境的真实案例研究,以使您更好地理解分析过程。

我们还将尝试证明过多的垃圾回收或Java堆空间的内存占用问题通常不是由真正的内存泄漏引起的,而是由线程执行模式和大量的短期对象引起的。

背景

您可能从我过去的JVM概述文章中看到,Java线程是JVM基础的一部分。 您的Java堆空间内存占用量不仅受静态对象和寿命长的对象的驱动,还受寿命短的对象的驱动。

通常会错误地认为OutOfMemoryError问题是由于内存泄漏引起的。 我们经常忽略错误的线程执行模式和它们在Java堆上“保留”到执行完成的短暂对象。 在这种有问题的情况下:

  • 您的“预期”应用程序的短期/无状态对象(XML,JSON数据有效载荷等)被线程保留的时间过长(线程锁争用,巨大的数据有效载荷,来自远程系统的响应时间慢等)。
  • 最终,这样的短期对象被垃圾收集器提升为长期对象空间,例如OldGen / tenured空间
  • 副作用是,这导致OldGen空间快速填充,从而增加了Full GC(主要集合)的频率
  • 根据情况的严重性,这可能导致过度的GC垃圾收集,JVM暂停时间增加,并最终导致OutOfMemoryError:Java堆空间
  • 您的应用程序现在关闭,您现在对正在发生的事情感到困惑
  • 最后,您正在考虑增加Java堆或寻找内存泄漏……您是否真的走对了?

在上述情况下,您需要查看线程执行模式,并确定它们在给定时间保留多少内存。

好了,我得到了图片,但是线程堆栈的大小呢?

避免线程堆栈大小和Java内存保留之间的混淆是非常重要的。 线程堆栈大小是JVM用于存储每个方法调用的特殊内存空间。 当线程调用方法A时,它将调用“推”到堆栈上。 如果方法A调用方法B,它也会被压入堆栈。 一旦方法执行完成,调用便从堆栈中“弹出”。

由于此类线程方法调用而创建的Java对象在Java堆空间上分配。 绝对增加线程堆栈大小不会有任何效果。 处理java.lang.stackoverflowerror或OutOfMemoryError:无法创建新的本机线程问题时,通常需要调整线程堆栈的大小。

案例研究和问题背景

以下分析基于我们最近调查的真实生产问题。

  • 在用户Web界面进行了一些更改(使用Google Web Toolkit和JSON作为数据有效负载)之后,从Weblogic 10.0生产环境中观察到严重的性能下降。
  • 初步分析确实揭示了OutOfMemoryError的几种情况:Java堆空间错误以及过多的垃圾回收。 在发生OOM事件后,会自动生成Java堆转储文件(-XX:+ HeapDumpOnOutOfMemoryError)
  • 对详细:gc日志的分析确实确认了32位HotSpot JVM OldGen空间(1 GB容量)的完全耗尽
  • 在问题发生之前和过程中也生成了线程转储快照
  • 当时唯一可以解决的问题是观察到问题时重新启动受影响的Weblogic服务器
  • 最终对变更进行了回滚,这确实解决了这种情况

团队首先从引入的新代码中怀疑了内存泄漏问题。

线程转储分析:寻找可疑对象…

我们所做的第一步是对生成的线程转储数据进行分析。 线程转储通常会向您显示在Java堆上分配内存的罪魁祸首线程。 它还将揭示试图从远程系统发送和接收数据有效载荷的任何占用线程或阻塞线程。

我们注意到的第一个模式是从Weblogic托管服务器(JVM进程)观察到的OOM事件和STUCK线程之间具有良好的相关性。 在找到的主线程模式下面找到:

<10-Dec-2012 1:27:59 o'clock PM EST> <Error> <BEA-000337><[STUCK] ExecuteThread: '22' for queue:'weblogic.kernel.Default (self-tuning)'has been busy for '672' seconds working on the requestwhich is more than the configured time of '600' seconds.

如您所见,以上线程似乎是STUCK或花费很长时间读取和接收来自远程服务器的JSON响应。 一旦找到该模式,下一步就是将该发现与JVM堆转储分析相关联,并确定这些卡住的线程从Java堆中占用了多少内存。

堆转储分析:保留的对象暴露在外!

Java堆转储分析是使用MAT执行的。 现在,我们将列出不同的分析步骤,这些步骤确实使我们可以查明保留的内存大小和源。

1.加载HotSpot JVM堆转储

2.选择HISTOGRAM视图并按“ ExecuteThread”进行过滤

* ExecuteThread是Weblogic内核用于线程创建和执行的Java类*

如您所见,这种观点非常明显。 我们可以看到总共创建了210个Weblogic线程。 这些线程保留的内存总量为806 MB。 这对于具有1 GB OldGen空间的32位JVM进程而言非常重要。 仅此观点就告诉我们问题的核心和内存保留源于线程本身。

3.深入研究线程内存占用量分析

下一步是深入研究线程内存保留。 为此,只需右键单击ExecuteThread类,然后选择:列表对象>带有传出引用。

如您所见,我们能够将线程转储分析中的STUCK线程与堆转储分析中的高内存保留量相关联。 这个发现非常令人惊讶。

4.线程Java局部变量识别

最后的分析步骤确实需要我们扩展一些线程示例并了解内存保留的主要来源。

如您所见,这最后一个分析步骤确实从根本原因上揭示了巨大的JSON响应数据有效载荷。 该模式还通过线程转储分析在早期公开,我们发现一些线程需要很长时间才能读取和接收JSON响应。 数据有效负载占用量巨大的明显症状。

至关重要的是要注意,通过局部方法变量创建的短期对象显示在堆转储分析中。 但是,其中一些将仅在其父线程中可见,因为这种情况下其他对象未引用它们。 您还需要分析线程堆栈跟踪以识别真正的调用者,然后进行代码检查以确认根本原因。

根据这一发现,在某些情况下,我们的交付团队能够确定最近的JSON错误代码更改正在生成高达45 MB +的巨大JSON数据有效负载。 考虑到该环境使用的是只有1 GB OldGen空间的32位JVM,您可以理解,只有几个线程足以触发严重的性能下降。

该案例研究清楚地表明了适当的容量规划和Java堆分析的重要性,包括从活动应用程序和Java EE容器线程中保留的内存。

其他一切都只是信息

我希望本文能帮助您了解如何通过结合线程转储和堆转储分析来确定活动线程保留的Java堆内存占用量。 现在,如果您不尝试的话,本文将仅停留在文字上,因此,我强烈建议您花一些时间自己学习针对您的应用程序进行的分析过程。

参考: Java Thread:保留了我们的JCG合作伙伴 Pierre-Hugues Charbonneau在Java EE支持模式和Java教程博客上进行的内存分析 。

翻译自: https://www.javacodegeeks.com/2012/12/java-thread-retained-memory-analysis.html

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

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

相关文章

软件测试白皮书-等价类

设有一个档案管理系统&#xff0c;要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月&#xff0c;并规定日期由6位数字字符组成&#xff0c;前4位表示年&#xff0c;后2位表示月。现用等价类划分法设计测试用例&#xff0c;来测试程序的"日期检查功能&qu…

深入css布局 (1) — 盒模型 元素分类

深入css布局&#xff08;1&#xff09;—— 盒模型 & 元素分类 “ 在css知识体系中&#xff0c;除了css选择器&#xff0c;样式属性等基础知识外&#xff0c;css布局相关的知识才是css比较核心和重要的点。今天我们来深入学习一下css布局相关的知识。” 首先来列下大纲 盒模…

批改网禁止粘贴怎么破_教育部对家长批改作业表态了,明令禁止!你怎么看?...

互联网的发展&#xff0c;的确方便了现代人生活。视频电话、出去买东西你都不用带钱带卡&#xff0c;手机一扫就可以完成支付。很多中小学的家长都会建一个家长群&#xff0c;方便老师和家长的沟通。这个群可以说是家长和学校的桥梁和纽带&#xff0c;家长们为了支持老师的工作…

MapReduce算法–顺序反转

这篇文章是介绍MapReduce算法的系列文章的另一部分&#xff0c;该书在使用MapReduce进行数据密集型文本处理中找到。 先前的文章是Local Aggregation &#xff0c; Local Aggregation PartII和创建共现矩阵 。 这次我们将讨论阶数反转模式。 顺序反转模式利用的MapReduce来计算…

液压支架销轴力学计算分析研究_基于RFID射频精准定位的智能开采研究与应用...

一、项目背景近年来随着智能开采技术的不断发展&#xff0c;装备和新工艺不断更新换代,在智能开采中&#xff0c;对采煤机位置的精准定位是能否实现智能开采的关键&#xff0c;只有准确无误地获取煤机的准确位置&#xff0c;才能实现工作面的智能化开采&#xff0c;进而提高生产…

您是否能及时编译?

还记得上次被C开发人员嘲笑的时候吗&#xff1f; Java如此繁琐&#xff0c;以至于他们甚至都不会考虑使用这种语言&#xff1f; 在许多方面&#xff0c;这一概念仍然成立。 但是对于典型的用法&#xff08;在大型企业的骨干中&#xff09;&#xff0c;Java性能绝对可以与许多竞…

2d物理引擎01

我一直想做一个游戏&#xff0c;但一直感觉自己水平不够 想了想觉得不去做的话就永远做不出来 所以有了这个博文 01 我需要一个东西来显示&#xff0c;很显然h5中canvas是很好的选择 <!DOCTYPE html> <html><head><meta charset"utf-8" />&l…

Liferay Model Hints

这篇文章主要介绍如何通过model hint 来修改liferay builder service生成数据库表中默认字段的长度。 1.什么是Model Hints? 它是对liferay builder service生成的model类的基本提示. 2. 它在什么地方被定义的&#xff1f; portlet-model-hints.xml 3. 文件位置&#xff1f; /…

浏览器书签备份管理

1、火狐浏览器备份导出HTML文件&#xff1a; CtrlJ 书签 - 导入/导出 2、谷歌浏览器&#xff1a; 设置中 导入书签 转载于:https://www.cnblogs.com/AmbiguousMiao/p/8084721.html

选择您的收藏库

这真的是您应该烦恼的吗&#xff1f; java.util.ArrayList和java.util.HashMap从根本上有问题吗&#xff1f; 对于大多数源代码&#xff0c;答案是–不&#xff1b; 这些实现完全可以。 但是&#xff0c;一如既往&#xff0c;细节决定成败。 并存在情况下&#xff0c;当是内置…

里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?

F4键在Word里面表示重复上一个操作&#xff0c;但对于这个快捷键&#xff0c;你真的会操作吗&#xff1f;本期与大家分享这个神奇的F4键&#xff0c;助你高效工作。1、批量复制文本在一般情况下&#xff0c;我们是用CtrlC复制内容&#xff0c;CtrlV粘贴内容&#xff0c;但遇到特…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…

数据导出

数据导出和数据导入刚好是相反的&#xff0c;把逻辑反过来就可以了。 源码&#xff1a;https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果&#xff1a; 然后勾选需要导出的数据&#xff0c;生成Excel 部分前台&#xff1a;…

spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

一、事务传播性1.1 什么是事务的传播性事务的传播性一般在事务嵌套时候使用&#xff0c;比如在事务A里面调用了另外一个使用事务的方法&#xff0c;那么这俩个事务是各自作为独立的事务执行提交&#xff0c;还是内层的事务合并到外层的事务一块提交那&#xff0c;这就是事务传播…

前端为什么非要动静分离 说一下CDN托管的意义

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存&#xff0c;因为浏览器缓存始终只是为了提升二次访问的速度&#xff0c;对于首次访问的加速&#xff0c;我们需要从网络层面进行优化&#xff0c;最常见的手段就是CDN&#xff08;Content Delivery Network&#xff0c;…

CSS position(定位)属性

关于CSS position&#xff0c;来自MDN的描述&#xff1a; CSS position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left 属性则决定了该元素的最终位置。 然后来看看什么是文档流(normal flow)&#xff0c;下面是 www.w3.org 的描述&#xff1a; Normal flo…

Java ByteBuffer –速成课程

以我的经验&#xff0c;当开发人员第一次遇到java.nio.ByteBuffer时&#xff0c;会引起混乱和细微的错误&#xff0c;因为如何正确使用它尚不明显。 在我对API文档感到满意之前&#xff0c;需要反复阅读API文档和一些经验以实现一些微妙之处。 这篇文章是关于如何正确使用它们的…

实现编辑功能有哪几个action_Web 应用的撤销重做实现

背景前不久&#xff0c;我参与开发了团队中的一个 web 应用&#xff0c;其中的一个页面操作如下图所示&#xff1a;GIF这个制作间页面有着类似 PPT 的交互&#xff1a;从左侧的工具栏中选择元素放入中间的画布、在画布中可以删除、操作&#xff08;拖动、缩放、旋转等&#xff…

windows下如何安装pip以及如何查看pip是否已经安装成功?

最近刚学习python&#xff0c;发现很多关于安装以及查看pip是否安装成的例子都比较老&#xff0c;不太适合于现在&#xff08;python 3.6 &#xff09;因此&#xff0c;下一个入门级别的教程。 0&#xff1a;首先如何安装python我就不做介绍了。 1&#xff1a;如果安装的是pyth…

检查用户显示器的分辨率

检查用户显示器的分辨率 转载于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html