java 强制gc_java应用性能调优之详解System的gc垃圾回收方法
一、什么是System.gc()?
System.gc()是用Java,C#和许多其他流行的高级编程语言提供的API。当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象)。名词解释:GC,Garbage Collection,垃圾回收,下文会经常使用。
二、谁可以调用System.gc()?
System.gc() 可以从应用程序堆栈的各个部分调用:
您自己开发的应用程序可以显式的调用 System.gc() 方法。
System.gc() 也可以由您的第三方库,框架触发。
可以由外部工具(如VisualVM)通过使用JMX触发
如果您的应用程序使用了RMI,RMI会定期调用 System.gc() 。
三、调用System.gc()有什么弊端?
当 System.gc() 或 Runtime.getRuntime().gc()API被调用时,将触发完整的GC事件。在GC完成之前,整个JVM将冻结(即正在运行的所有服务将被暂停),通常完整的GC需要很长时间才能完成。因此在不合适的时间运行GC,将导致不良的用户体验,甚至是崩溃。
JVM具有复杂的算法,该算法始终在后台运行,进行所有计算以及有关何时触发GC的计算。当您显式调用System.gc()调用时,所有这些计算都将被抛掉。
四、哪些场景适合显式调用System.gc()?
GC操作应该由JVM自行控制,在绝大部分的场景都不建议程序员手动写代码显式进行System.gc()操作,但是也不排除其中个别例外:在我们开发多个微服务时,每个服务都有多个备份节点。在非业务高峰时段,我们可以从微服务-负载均衡的节点池中取出其中一个JVM实例。然后通过该JVM上的JMX显式触发System.gc()调用,一旦GC事件完成并且从内存中清除了垃圾,将该JVM放回到微服务-负载均衡的节点池中。
当然这个过程需要很好的微服务管理及服务发布机制配合,这样既能保证JVM垃圾内存的有效清理,又不影响业务的正常运行。
五、如何检测您的应用程序正在进行System.gc()?
如第二小节所讲: System.gc() 可以从多个渠道进行的调用,而不仅仅是从您的应用程序源代码进行的调用。因此,搜索您的应用程序代码System.gc() 字符串,不足以知道 GC是否正在被调用。这就构成了一个挑战:如何检测应用程序是否正在进行垃圾回收?这就是GC日志派上用场的地方。
// java 8 启用GC日志:
// -XX:+PrintGCDetails -Xloggc: ,例如下面这行代码
-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log
// java 9 启用GC日志:-Xlog:gc*:file= ,例如下面这行代码
-Xlog:gc*:file=/opt/tmp/myapp-gc.log
建议始终在所有生产服务器中始终启用GC日志,因为它有助于您排除故障并优化应用程序性能。启用GC日志只会增加微不足道的开销。还可以将您的GC日志上传到垃圾收集日志分析器工具,例如GCeasy,HP JMeter等。这些工具将生成丰富的垃圾收集分析报告。
上图摘自GCeasy生成的报告。
六、如何禁止GC显式调用或调整调用GC的频率?
如果我们就是想避免程序员显式调用GC,避免不成熟的程序员在不合适时间调用GC,避免人为造成的GC崩溃,该怎么办?可以通过如下方法:
搜索和替换
在代码库中搜索 System.gc() 和Runtime.getRuntime().gc()。如果看到匹配项,则将其删除。但是这种方法无法避免第三方库、框架或通过外部源进行调用,那么参考第二种方法。
通过JVM参数强制禁止
通过传递JVM参数 -XX:+DisableExplicitGC来强制禁止显式调用。这种方式强制、有效,应用程序内的任何GC显式代码调用System.gc() 都将被禁止生效。JVM自身的GC策略不受此参数影响,只禁止人为的触发GC。
RMI
如果您的应用程序正在使用RMI,则可以控制GC调用的频率 。启动应用程序时,可以使用以下JVM参数配置该频率:
-Dsun.rmi.dgc.server.gcInterval=n
-Dsun.rmi.dgc.client.gcInterval=n
这些属性的默认值在
JDK 1.4.2和5.0是60000毫秒(即60秒)
JDK 6和更高版本是3600000毫秒(即60分钟)
如果您的应用主机内存资源非常富余,您可以将这些属性设置为很高的值,以便可以将GC带来的对应用程序的影响最小化。这也是应用程序性能优化的一种方式之一。
期待您的关注
本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
java 强制gc_java应用性能调优之详解System的gc垃圾回收方法相关推荐
- java强制gc_java应用性能调优之详解System的gc垃圾回收方法
一.什么是System.gc()? System.gc()是用Java,C#和许多其他流行的高级编程语言提供的API.当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象).名词解释:GC, ...
- java垃圾回收system_java应用性能调优之详解System的gc垃圾回收方法
1.什么是System.gc()? System.gc()是用Java,C#和许多其余流行的高级编程语言提供的API.当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象).名词解释:GC, ...
- Java 性能调优 概念详解 小白教程
对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...
- 如何开启jvm日志_直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解...
JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...
- 深入理解Java虚拟机:Jvm性能调优
本篇内容包括:Jvm 性能调优简介:根据需求目标进行 Jvm 调优规划(即 调优的目标.调优的步骤):Jvm 调优参数.命令.工具:以及 Java 中的内存泄露问题的详解- 一.Jvm 性能调优简介 ...
- Java SE和Java EE应用的性能调优
凡事预则立,不预则废,和许多事情一样,Java性能调优的成功,离不开行动计划.方法或策略以及特定的领域背景知识.为了在Java性能调优工作中有所成就,你得超越"花似雾中看"的状态, ...
- [案例] java项目故障诊断和性能调优(window版)
做这次性能调优主要是项目每当在使用高峰期就会出现卡顿,加载速度慢,严重影响工作效率,因此开始排查故障和调优 一,问题定位 在故障出现时优先打开任务管理器和资源监视器主要查看CPU和内存的使用情况(后面 ...
- 看完去怼面试官,Java尊享版性能调优分享给大家
很多程序员一开始在学习上找不到方向,但我想在渡过了一段时间的新手期之后这类问题大多都会变得不再那么明显,工作的方向也会逐渐变得清晰起来. 但是没过多久,能了解到的资料就开始超过每天学习的能力,像是买了 ...
- 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解
JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...
最新文章
- WinXP不能共享Win7的打印机的解决方法
- go 方法接受者 是指针类型和非指针类型的 区别
- 网易实战分享|Docker文件系统实战
- Hike on a Graph HDU - 1252(bfs)
- qbuttongroup如何都不选中_全程马拉松,半程马拉松该如何跑?很多人都不知道这些细节...
- sql2005镜像实现
- Android6,androidstudio游戏开发教程
- C# For Koyo PLC Serial Port Communication Library,C# 与光洋PLC通讯库,光洋PLC通讯,PLC通讯,光洋
- 物联网在环境中的应用
- 使用Mac终端给文件夹加密压缩
- vue全家桶都有哪些
- 虚拟服务器设置虚拟内存,vmware虚拟机关于内存的一项设置,可以提高你的虚拟机运行效能-虚拟内存怎么设置最好...
- 有哪些值得推荐的 Python 开发工具
- 服务器项目混淆,压缩和混淆node.js服务端代码
- sphinx全文检索之PHP使用教程
- 考研数据结构之队列(3.3)——练习题之设计一个循环队列,用front和rear分别作为队头和队尾指针,另外用一个标志tag表示队列是空还是不空来设计队列的结构和相关基本运算算法(C表示)
- java选择题《每日一练》
- 区块链:Casper 机制的历史起源:第一篇
- C++ 类型定义顺序问题
- C练题笔记之:Leetcode-393. UTF-8 编码验证
热门文章
- word回车后间距太大_Word这些神奇的功能,你知道多少?学会这4招,工作不再发愁...
- 计划完成提醒系统C语言,通信录管理计划系统C语言知识程序设计.doc
- android 之多线程详解
- dw上按钮事件 pb_「React TS3 专题」使用 TS 的方式在类组件里定义事件
- bigquery sql 正则表达式
- Ubuntu 安装redis desktop manager
- float python_Python中float('INF')的使用
- python笔记 print+‘\r‘ (打印新内容时删除打印的旧内容)
- 文巾解题 14. 最长公共前缀
- 文巾解题 8. 字符串转换整数 (atoi)