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:<gc-log-file-path> ,例如下面这行代码
-XX:+PrintGCDetails -Xloggc:/opt/tmp/myapp-gc.log

// java 9 启用GC日志:-Xlog:gc*:file=<gc-log-file-path> ,例如下面这行代码
-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带来的对应用程序的影响最小化。这也是应用程序性能优化的一种方式之一。

原文地址:https://blog.51cto.com/14230003/2455022

时间: 2024-10-29 15:49:17

Java应用性能调优之详解System的gc垃圾回收方法的相关文章

下载深入Java程序性能调优(阿姆达尔定律、缓存组件、并行开发、线程池、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1cvD3rw 密码:eevh 1.1. 性能概述--两个实战在线项目对比突出性能的重要性1.2. 性能概述--阿姆达尔定律解决性能的关键点2.1. 设计优化--模式在实际开发中运用012.2. 设计优化--模式在实际开发中运用02-延迟加载的核心2.3. 设计优化--模式在实际开发中运用03-基于动态代理的拦截器2

Java性能调优_深入Java程序性能调优(并行开发、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优)课程讲师:special课程分类:Java核心适合人群:初级课时数量:33课时更新程度:完成用到技术:阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优涉及项目:模式在实际开发中运用深入Java程序性能调优下载: http://pan.baidu.com/s/1ntn0ZTB 密码: ijluJava性能调优:国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,

项目总结50:Linux服务器上web项目Java项目性能调优

项目总结50:Linux服务器上web项目Java项目性能调优 最近上线的电商项目,发现非常卡,用户体验非常差,折腾了好久之后,也逐渐找到原因,并针对原因解决方案,先整理总结. 项目基本情况: 1-使用阿里ECS.OSS等一系列相关服务: 2-用户总量1W+,日活量500+ 3-电商项目,有APP.小程序.管理平台三个模块,其中接口150+ 4-项目使用SSM框架: 5-项目tomcat服务,数据库Mysql,Redis放在一个同一个服务器上: 问题表现: 1-接口反应非常慢,导致APP和小程序

Java程序性能调优深入浅出视频下载

国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,十余年Java方面开发工作经验,资深软件开发系统架构师,本套课程系多年工作经验与心得的总结,课程有着很高的含金量和实用价值,一套拥有,高薪可求!一.本课程是怎么样的一门课程(全面介绍)   1.1.课程的背景    该课程是让大多数java开发者立足于编写高质量的程序,去感受java开发中的大智慧, 让java程序更优美. 1.2.课程内容简介 专注于java应用程序的优化方法,技巧和思想,

Java 应用性能调优实践

Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来.Java 应用性能的瓶颈点非常多,比如磁盘.内存.网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等.笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层.数据库层.框架层.JVM 层,如图 1 所示. 图 1.Ja

Java程序性能调优的基本知识和JDK调优

一 基本知识 1.1 性能是什么 在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列出几点,甚至可以夸夸其谈.在<Java TM Platform Performance>一书中,定义了如下五个方面来作为评判性能的标准: 1) 运算的性能--哪一个算法的执行性能最好? 2) 内存的分配--程序运行时需要耗费多少内存? 3) 启动的时间--程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如applet程序)

java程序性能调优---------------性能概述

一.程序的性能通过哪几个方面表现 1.执行速度(程序反应反应是否迅速.响应时间是否足够短) 2.分配内存 (分配内存是否合理,是否过多的消耗内存或者内存溢出) 3.启动时间(程序从运行到可以正常处理业务需要花费多长时间) 4.负载承受能力(当系统压力上升时,系统的执行速度.响应时间的上升曲线是否平缓) 二.性能的参考指标 1.执行时间(一段代码从开始运行到运行结束,所使用的时间) 2.CPU时间(函数或者线程占用CPU实际) 3.内存分配(程序在运行时占用的内存空间) 4.磁盘吞吐量(描述I/O

JVM 调优参数详解

GC有两种类型:Scavenge GC 和Full GC 1.Scavenge GC 一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,堆的Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor的两个区中. 2.Full GC 对整个堆进行整理,包括Young.Tenured和Perm.Full GC 比Scavenge GC要慢,因此应该尽可能减少Full GC,有如下原因可能导致Full GC a.Tenured被写满: b.P

深入Java程序性能调优视频教程

下载:http://pan.baidu.com/s/1bi7Kj8 密码:mujd 课程专注于java应用程序的优化方法,技巧和思想,深入剖析软件设计层面.代码层面.JVM虚拟机层面的优化方法,理论结合实际,使用丰富的示例帮助学员理解理论知识. 第一课(性能概述--两个实战在线项目对比突出性能的重要性) 第二课(性能概述--阿姆达尔定律解决性能的关键点) 第三课(设计优化--模式在实际开发中运用01) 第四课(设计优化--模式在实际开发中运用02--延迟加载的核心) 第五课(设计优化--模式在实