在Hotspot JVM中跟踪过多的垃圾回收

由于内存泄漏或其他内存问题,经常导致应用程序冻结,仅使垃圾收集器(GC)进程运行失败,试图释放一些空间。 直到看门狗(或沮丧的管理员)重新启动应用程序并且问题从未解决之前,这种情况一直发生。
本文的目的是说明如何识别过多的GC,以及如何在发生堆垃圾时进行堆转储。 假定Hotspot JVM 1.6或更高版本。
相关的JVM标志
使用以下标志,我们可以指示Hotspot JVM在应用程序变为GC驱动时引发堆转储。
首先,应添加-XX:+ HeapDumpOnOutOfMemoryError标志。
我们的目标是在由于不停止GC而导致应用程序吞吐量下降时生成OutOfMemory错误。 有两个JVM标志将有帮助:
  • -XX: GCTimeLimit = 98 –定义抛出OutOfMemory错误之前在GC中花费的时间比例的限制
  • -XX: GCHeapFreeLimit = 2 –定义完整GC之后抛出OutOfMemoryError之前的可用空间的最小百分比
默认情况下,两个标志都是启用的,但是内存不足错误不会经常触发。 因此,需要更深入的了解才能确定每个标志何时有用以及默认值是什么。
Oracle文档
 
过多的GC时间和OutOfMemoryError。
如果在垃圾回收上花费了太多时间,则并发收集器将抛出OutOfMemoryError:如果在垃圾回收中花费了总时间的98%以上,而回收的堆少于2%,则将抛出OutOfMemoryError。 此功能旨在防止应用程序长时间运行,而由于堆太小而几乎没有进展,甚至没有进展。 如有必要,可以通过在命令行中添加选项-XX:-UseGCOverheadLimit来禁用此功能。
该策略与并行收集器中的策略相同,除了执行并发收集所花费的时间不计入98%的时间限制。 换句话说,只有在应用程序停止时执行的收集才计入过多的GC时间。 此类收集通常是由于并发模式故障或显式收集请求(例如,对System.gc()的调用)引起的。
如第二段所述, GCTimeLimit在并行收集器上不能很好地工作,因为在这种情况下花费在GC上的时间不太重要。
为GCHeapFreeLimit选择默认值
 
选择默认值的方式应使当应用程序变得无响应(或由GC驱动)时,将导致内存不足。 无响应性是一个主观定义,可能因应用程序而异,因此,对于不同的应用程序,其结果值可能会(略有不同)不同。
首先,应该创建一个简单的测试。 在应用程序内部运行并分配大量对象的类。 可以快速收集部分对象,并可以长期保留部分对象。
在运行测试之前,应添加GC日志记录标志。 对于我的应用程序,添加了以下标志:
-Xmx960m-详细:gc -XX:+ PrintGCDetails -XX:+ PrintGCDateStamps -XX:+ PrintTenuringDistribution -Xloggc:/root/gc.log -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath = / root / dumps
GC日志的输出如下所示。 第一个完整的GC周期–应用程序响应Swift:
[完整GC [PSYoungGen:290112K-> 33213K(308672K)] [PSOldGen:655359K-> 655359K(655360K)] 945471K-> 688573K(964032K)]
几分钟后–应用程序无响应:
[完整GC [PSYoungGen:290112K-> 213269K(308672K)] [PSOldGen:655359K-> 655359K(655360K)] 945471K-> 868629K(964032K)]
对于950 Mb堆,内存空间的分配为:老gen = 650Mb,年轻= 300Mb。 当应用程序响应时,老一代将充满强大的参考数据,而大多数年轻一代则是垃圾。
因此,GCHeapFreeLimit的一个估计是(清除所有年轻人,不清除任何旧东西)300/950〜32%。
但是,随着时间的流逝,无法将年轻空间中的物体提升为旧空间,因为空间已满。 就像在Oracle文档中所说的那样: 最年轻的集合并不需要保证完全升级所有活动对象。 (-XX:+ HandlePromotionFailure标志)。
由于促销失败,因此引用的对象比年轻一代期望的要多得多。 为了安全起见(减少误报),我假设当年轻空间的1/3以上是垃圾空间而旧空间已满时,系统由GC驱动。
因此,我建议类似我的应用的比率是200/950〜20%。
-XX: GCHeapFreeLimit = 20
实验表明,OOM在超出20%限制的1-2分钟过量GC后发生,在此期间发生30-35个完整GC。
结论
在没有灵丹妙药的Java中,识别过多的垃圾回收是一项艰巨的任务。 热点JVM开发人员提供了一些方法,这些方法将经常有助于识别根本原因。 如果正确使用GCHeapFreeLimit和GCTimeLimit标志,可以使用适当的值来阐明问题。
参考文献
1. http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
2. http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
参考:来自The Art of Java博客的JCG合作伙伴 Art Gourevitch 在Hotspot JVM中跟踪过多的垃圾收集 。

翻译自: https://www.javacodegeeks.com/2012/06/tracking-excessive-garbage-collection.html

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

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

相关文章

linux 网络在线升级,linux在线升级

//前提信息:1.系统分区信息SPI-Flash:[0] 0x000000000000-0x000000020000 : "SPL,128KB"[1] 0x000000020000-0x0000000e0000 : "U-Boot,768KB"[2] 0x0000000e0000-0x000000100000 : "U-Boot Env,128KB"[3] 0x000000100000-0x00000020…

XML反序列化出错,XML 文档(2, 2)中有错误

XML转换为实体类的错误处理方案 一.错误描述&#xff1a; XML反序列化出错&#xff0c;XML 文档(2, 2)中有错误二.解决方案&#xff1a; 在实体类的字段要加上XmlElement属性三.具体实现: 1.XML文档 <EVENT_INSTANCE><EventType>ALTER_TABLE</EventType><…

iOS--支付宝环境集成

1.下载支付宝SDK以及Demo https://doc.open.alipay.com/doc2/detail?treeId54&articleId103419&docType1 2.新建文件夹“AliSDK”&#xff0c;将压缩包内的文件拷贝到该文件夹下&#xff0c;完成后如下图所示&#xff1a; 3.将文件夹拷贝到项目中&#xff0c; 4.执行完…

再见,再见,5 * 60 * 1000 //五分钟,再见,再见

在这篇文章中&#xff0c;我将讨论一个在1.5版中首次引入的类&#xff0c;我使用了太多&#xff0c;但是与一些人交谈&#xff0c;他们说他们不知道它的存在。 此类是TimeUnit 。 TimeUnit类表示给定粒度单位的持续时间&#xff0c;还提供了转换为不同单位的实用方法以及执行计…

windows如何调用Linux的API,Windows和Native API中的系统调用?

最近&#xff0c;我在* NIX操作系统中使用了很多汇编语言。我想知道Windows域。Linux中的调用约定&#xff1a;mov $SYS_Call_NUM, %eaxmov $param1 , %ebxmov $param2 , %ecxint $0x80而已。这就是我们应该如何在Linux中进行系统调用。linux中所有系统调用的参考&#xff1a;关…

maven生命周期和插件

maven生命周期和插件 生命周期 maven的生命周期有三套&#xff0c;互相独立。每个生命周期含有不同阶段&#xff0c;常用如下 clean 清理项目 pre-clean 执行清理前需要完成的工作clean 清理上一次构建生成的文件post-clean 执行清理后需要完成的工作default 构建项目 validate…

Java EE 6测试第二部分– Arquillian和ShrinkWrap简介

在Java EE 6测试的第一部分中&#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API&#xff0c;以演示如何启动该容器&#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它们是用于企…

linux内存分配堆栈数据段代码段,linux – LD_PRELOAD堆栈和数据段内存分配

你好,我正在编写一个Linux模块(基于名为“Ccontrol”的GitHub项目)来创建缓存分区(a.k.a页面着色),以减轻定时侧通道攻击(用于防止Prime Probe等攻击).我已经使用LD_PRELOAD系统env变量来覆盖所有malloc(),calloc()和free()调用,并用颜色感知调用替换它们.现在我正在寻找颜色堆…

【腾讯Bugly干货分享】Android内存优化总结实践

本文来自于腾讯Bugly公众号&#xff08;weixinBugly&#xff09;&#xff0c;未经作者同意&#xff0c;请勿转载&#xff0c;原文地址&#xff1a;https://mp.weixin.qq.com/s/2MsEAR9pQfMr1Sfs7cPdWQ 导语 智能手机发展到今天已经有十几个年头&#xff0c;手机的软硬件都已经发…

以编程方式向OpenJPA注册实体类型

我刚刚开始为Isis开发 OpenJPA对象库 。 在一般情况下&#xff0c;可以在persistence.xml文件中注册实体类型。 但是&#xff0c;Isis是一个框架&#xff0c;可以构建自己的元模型&#xff0c;并且可以自行确定哪些类构成实体。 因此&#xff0c;我不想强​​迫开发人员重复自己…

linux redis客户端,Redisson 3.4.0和2.9.0发布,Redis客户端

Redisson 3.4.0和2.9.0发布&#xff0c;Redis客户端发布时间:2017-04-27 09:12:16来源:红联作者:baihuoRedisson于2017年4月26日发布了3.4.0和2.9.0版本Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优…

LeetCode 349 Intersection of Two Arrays

Given two arrays, write a function to compute their intersection. Example: Given nums1 [1, 2, 2, 1], nums2 [2, 2], return [2]. 思路&#xff1a; 利用ArrayList的contains(Object o)方法进行交集的查询。 解法&#xff1a; 1 import java.util.ArrayList;2 3 publi…

shell脚本1——变量 $、read、``

与Shell变量相关的几个命令&#xff1a; 变量只在当前Shell中生效. source 这个命令让脚本影响他们父Shell的环境&#xff08;. 可以代替source命令&#xff09; export 这个命令可以让脚本影响其子Shell的环境 () unset 从环境中删除变量 其他几个与变量有关的命令&#xff1…

令人印象深刻的第一个Apache Camel版本

为了准备下周的CamelOne会议&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印象。 现在您…

Linux禁用user01账户,Linux 管理用户 useradd

创建用户、设置密码、修改用户、删除用户&#xff1a;useradd testuser 创建用户testuseruseradd [选项]useradd 命令选项-u uid:指定新用户的uid,默认用当前最大uid加1-g group:指定新用户所在的组(私有组),该组必须存在-G group:指定新用户的附加组-d dir:指定新用户的自家目…

css小细节

1. 文字居中显示 水平居中&#xff1a; text-align: center; 垂直居中&#xff1a; line-height: (height); 2.子元素相对于父元素的绝对布局。 父元素一定要 position: relative/absolute/fixed; 默认position 是static 转载于:https://www.cnblogs.com/zcancandice/p/5…

为什么在2012/2013年我将在新的Enterprise Java项目中继续使用Spring *和* Java EE

自从我担任技术决策职务以来已经过去了一年多&#xff0c;很高兴看到我仍然与之保持着完美的和谐。 几个月前&#xff0c;我在KaiWhner的一个不错的博客中写了一个有关JEE与Spring的答案。 如果观点没有不同&#xff0c;那么讨论的附加值在哪里&#xff1f; 我确实同意Kai的许多…

linux ubuntu 五笔输入法,ubuntu下安装fcitx五笔输入法

安装fcitx输入法sudo add-apt-repository ppa:fcitx-team/stable #添加安装源&#xff0c;apt-get 添加&#xff0c;nightly源也可以sudo apt-get update #更新源&#xff0c;否则无法安装fcit…

浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联

看到网上很多关于svn环境配置和关联Android-Studio的很多博文&#xff0c;发现很零散&#xff0c;想集大家所长整理一下&#xff1a; 在AndroidStudio中开发版本控制中&#xff0c;除了Git就是SVN&#xff0c;和Eclipse不同Android Studio没有提供单独的插件&#xff0c;只能和…

四. 基于环视Camera的BEV感知算法-BEVDepth

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…