分析java 线程占用内存_Java线程:保留的内存分析

分析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)
  • 对verbose: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

分析java 线程占用内存

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

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

相关文章

图像傅里叶变换

1傅里叶变换物理意义 图像的频率是表征图像中灰度变化剧烈程度的指标&#xff0c;是灰度在平面空间上的梯度。如&#xff1a;大面积的沙漠在图像中是一片灰度变化缓慢的区域&#xff0c;对应的频率值很低&#xff1b;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧…

python获取涨停股票_今日股市光大证券

一、查询股票账户的总盈亏的方法如下&#xff1a;1、查询你的银行银证转账记录&#xff0c;用转进的资金总额减去转出的资金总额&#xff0c;再和你现在的证券账户市值比较&#xff0c;即可得出盈亏。2、联系你的开户券商&#xff0c;通过柜面进行轧差查询资金进出情况&#xf…

MVC web api 返回JSON的几种方式,Newtonsoft.Json序列化日期时间去T的几种方式

MVC web api 返回JSON的几种方式&#xff0c;Newtonsoft.Json序列化日期时间去T的几种方式 2015-01-18 00:11 https://www.muhanxue.com/essays/2015/01/8623699.html MVC web api 返回JSON的几种方式 1、在 WebApiConfig的 Register中加入以下代码 config.Formatters.JsonForm…

从微服务到分布式系统-Java开发人员生存指南

感觉像是对微服务的炒作正在慢慢地落到实处&#xff0c;并且我们的行业开始意识到&#xff0c;仅通过在现有组件之上公开一些HTTP接口就无法轻松创建根据微服务背后的体系结构范式的系统。 我们似乎确实同意必须进行服务优化的基础架构&#xff0c;文化和组织变革&#xff0c;最…

timespan怎么比较大小_钻石吊坠回收怎么选择大小?

钻石吊坠也是比较常见的钻饰&#xff0c;和钻戒不同的是&#xff0c;钻石吊坠并不是必须要买的珠宝&#xff0c;但作为点缀全身的装饰&#xff0c;钻石吊坠的大小问题也让大家很是关注&#xff0c;钻石吊坠回收怎么选择大小&#xff1f;一般我们会把钻石从10分算起(10分以下的钻…

图像边缘算子

&#xff08;1&#xff09;常见边缘检测算子&#xff1a;Roberts 、Sobel 、Prewitt、Laplacian、Log/Marr、Canny、Kirsch、Nevitia &#xff08;2&#xff09; 其中一阶边缘算子&#xff1a;Roberts 、Sobel 、Prewitt、Kirsch。 其中二阶边缘算子&#xff1a;Laplacian、Log…

python使用telnet远程连接linux系统读取信息_Linux服务笔记之一:Telnet 远程登录

最近&#xff0c;在学习Linux服务器中的搭建&#xff0c;感觉上非常强大。下面&#xff0c;我写下在Linux下搭建Telnet服务来远程管理设备&#xff0d;&#xff0d;这也是一种古老的远程管理方 式这一。其中&#xff0c;Telnet服务也是基于C/S模式的。客户端用Telnet远程登录协…

团队作业(五):冲刺总结

团队作业&#xff08;五&#xff09;&#xff1a;冲刺总结 转载于:https://www.cnblogs.com/20175226wpy/p/10964911.html

matlab 判断对象的数据类型isa()

K isa(obj, class_name) 判断obj是否为class_name类型。如果是&#xff0c;返回逻辑1&#xff08;真&#xff09;&#xff1b;如果不是&#xff0c;返回逻辑0&#xff08;假&#xff09;。 参量obj是一个MATLAB对象或者Java对象。参量class_name是MATLAB&#xff08;预定义的…

使用Oracle Data Integrator(和Kafka / MapR流)完善Lambda体系结构

“ Lambda体系结构是一种数据处理体系结构&#xff0c;旨在通过利用批处理和流处理方法来处理大量数据。 这种体系结构方法试图通过使用批处理提供批处理数据的全面而准确的视图&#xff0c;同时使用实时流处理提供在线数据的视图来平衡延迟 &#xff0c; 吞吐量和容错能力 。 …

matlab regionprops区域属性信息

stats regionprops(L,properties) 返回的stats为一个结构体struct 测量标注矩阵L中每一个标注区域的一系列属性。L中不同的正整数元素对应不同的区域&#xff0c;例如&#xff1a;L中等于整数1的元素对应区域1&#xff1b;L中等于整数2的元素对应区域2&#xff1b;以此类推。…

python3虚拟环境使用教程_python虚拟环境完美部署教程

一、前言预处理建议仔细看完本文章之后在进行操作&#xff0c;避免失误&#xff0c;本环境可以用于生产环境&#xff0c;有利于生产环境python之间的环境隔离&#xff0c;互相不会产生环境冲突&#xff1b;pyenv和pyenv-virtualenv可以完美结合使用&#xff0c;具体使用情况看项…

yandexbot ip列表整理做俄罗斯市场的站长可以关注一下

这段时间ytkah在负责一个客户的网站&#xff0c;主要做俄罗斯市场&#xff0c;当然是要研究Yandex了&#xff0c;首先是要知道yandexbot的ip有哪些&#xff0c;本文通过分析这个站从2018.12.02到2019.05.21这段时间产生的网站log日志得出的结果&#xff0c;log日志文件1.3G&…

为什么闲鱼不能搜索python_Python 分析后告诉你闲鱼上哪些商品抢手?

前言文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。作者&#xff1a;【Airpython】PS&#xff1a;如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun准 备 工 作在编写代码…

matlab imfill孔洞填充

BW2 imfill(BW) 作用填充二值图像BW中的空洞 clear all; clc; close all; img imread(test1.png); if ndims(img)3 img rgb2gray(img); end img_bw im2bw(img); img_fill imfill(img_bw, holes); figure; subplot(1,2,1),imshow(img_bw), title(有空洞的图像); s…

将Gatling集成到Gradle构建中–了解SourceSet和配置

我最近在一个项目中工作&#xff0c;我们不得不将出色的负载测试工具Gatling集成到基于Gradle的版本中。 有可用的gradle插件使此操作变得容易&#xff0c;其中两个是this和this &#xff0c;但是对于大多数需求而言&#xff0c;只需简单执行命令行工具本身就足够了&#xff0c…

matlab bwlabel标记连通区域

[L,num] bwlabel(BW,n) 这里num返回的就是BW中连通区域的个数。返回一个和BW大小相同的L矩阵&#xff0c;包含了标记了BW中每个连通区域的类别标签&#xff0c;这些标签的值为1、2、num&#xff08;连通区域的个数&#xff09;。n的值为4或8&#xff0c;表示是按4连通寻找区域…

mysql遇到时区问题的坑(Java解决方案)

最近项目遇到一个坑&#xff0c;就是server和db之间存在时区问题&#xff0c;本人的db是utc时间&#xff0c; 可以使用代码设置时区来解决&#xff0c;本人这里使用joda三方包&#xff0c;joda蛮好用的&#xff0c;具体用法这里不做详细描述。 先引入pom <dependency><…

vba 不等于_EXCEL表格VBA中的运算符

就像函数公式里面需要运算符一样&#xff0c;VBA中同样也需要运算符&#xff0c;今天我们就来了解下VBA中的运算符是怎么表达的。在学习运算符前&#xff0c;我们先来学习一段简单的VBA代码&#xff0c;Msgbox的表达。在代码窗口中输入&#xff1a;sub test ()tset表示测试的意…

C++常用的容器(vector、set、list、map)

C STL中最基本以及最常用的类或容器无非就是以下几个&#xff1a; stringvectorsetlistmap 下面就依次介绍它们&#xff0c;并给出一些最常见的最实用的使用方法&#xff0c;做到快速入门。 string 首先看看我们C语言一般怎么使用字符串的 char* s1 "Hello SYSU!&quo…