1、什么是System.gc()?

System.gc()是用Java,C#和许多其余流行的高级编程语言提供的API。当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象)。名词解释:GC,Garbage Collection,垃圾回收,下文会常用。java

2、谁能够调用System.gc()?

System.gc() 能够从应用程序堆栈的各个部分调用:程序员

您本身开发的应用程序能够显式的调用 System.gc() 方法。

System.gc() 也能够由您的第三方库,框架触发。

能够由外部工具(如VisualVM)经过使用JMX触发

若是您的应用程序使用了RMI,RMI会按期调用 System.gc() 。

3、调用System.gc()有什么弊端?

当 System.gc() 或 Runtime.getRuntime().gc()API被调用时,将触发完整的GC事件。在GC完成以前,整个JVM将冻结(即正在运行的全部服务将被暂停),一般完整的GC须要很长时间才能完成。所以在不合适的时间运行GC,将致使不良的用户体验,甚至是崩溃。 JVM具备复杂的算法,该算法始终在后台运行,进行全部计算以及有关什么时候触发GC的计算。当您显式调用System.gc()调用时,全部这些计算都将被抛掉。算法

4、哪些场景适合显式调用System.gc()?

GC操做应该由JVM自行控制,在绝大部分的场景都不建议程序员手动写代码显式进行System.gc()操做,可是也不排除其中个别例外:在咱们开发多个微服务时,每一个服务都有多个备份节点。在非业务高峰时段,咱们能够从微服务-负载均衡的节点池中取出其中一个JVM实例。而后经过该JVM上的JMX显式触发System.gc()调用,一旦GC事件完成而且从内存中清除了垃圾,将该JVM放回到微服务-负载均衡的节点池中。 固然这个过程须要很好的微服务管理及服务发布机制配合,这样既能保证JVM垃圾内存的有效清理,又不影响业务的正常运行。spring

5、如何检测您的应用程序正在进行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等。这些工具将生成丰富的垃圾收集分析报告。springboot

上图摘自GCeasy生成的报告。性能优化

6、如何禁止GC显式调用或调整调用GC的频率?

若是咱们就是想避免程序员显式调用GC,避免不成熟的程序员在不合适时间调用GC,避免人为形成的GC崩溃,该怎么办?能够经过以下方法:服务器

搜索和替换

在代码库中搜索 System.gc() 和Runtime.getRuntime().gc()。若是看到匹配项,则将其删除。可是这种方法没法避免第三方库、框架或经过外部源进行调用,那么参考第二种方法。app

经过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垃圾回收system_java应用性能调优之详解System的gc垃圾回收方法相关推荐

  1. java 强制gc_java应用性能调优之详解System的gc垃圾回收方法

    一.什么是System.gc()? System.gc()是用Java,C#和许多其他流行的高级编程语言提供的API.当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象).名词解释:GC, ...

  2. java强制gc_java应用性能调优之详解System的gc垃圾回收方法

    一.什么是System.gc()? System.gc()是用Java,C#和许多其他流行的高级编程语言提供的API.当它被调用时,它将尽最大努力从内存中清除垃圾(即未被引用的对象).名词解释:GC, ...

  3. Java 性能调优 概念详解 小白教程

    对于很多研发人员来说,Java 性能调优都是很头疼的问题,为什么这么说?如今,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优 ...

  4. 如何开启jvm日志_直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解...

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

  5. JVM调优系列:(四)GC垃圾回收

    跟踪收集算法: 复制(copying): 将堆内分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间 ...

  6. 直通BAT必考题系列:JVM性能调优的6大步骤,及关键调优参数详解

    JVM系列 直通BAT必考题系列:7种JVM垃圾收集器特点,优劣势.及使用场景 直通BAT必考题系列:JVM的4种垃圾回收算法.垃圾回收机制与总结 直通BAT必考题系列:深入详解JVM内存模型与JVM ...

  7. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  8. jvm与Tomcat调优【详解】——有这一篇就够了

    jvm与Tomcat调优 一.JVM性能调优 1.1 什么是JVM? 1.2 JVM调优工具 1.3 JVM调优经验 1.4常用JVM参数参考: 1.5 Java文件编译的过程 1.6 为什么说jav ...

  9. 详解JVM和GC垃圾回收

    文章目录 JVM架构图分析 Java虚拟机运行时数据区 对象的创建方式有几种? 创建对象的过程 对象的访问定位 垃圾回收机制 如何判断一个对象是否可以回收 垃圾回收算法都有哪些? 对象分代 垃圾回收器 ...

最新文章

  1. 解决keepalived脑裂问题
  2. mysql授权其他用户导出数据_mysql创建账号、授权、数据导出、导入
  3. delphi 数据库显示的TDBGrid配置
  4. 多地发钱鼓励生育,能刺激年轻人生娃吗
  5. CacheDependency用法
  6. 宜搭数字工厂,让订单周期缩减三分之一
  7. LeetCode 123. 买卖股票的最佳时机 III(动态规划)
  8. 第一课[编辑器设置-VC++6.0]
  9. Oracle数据库导入导出 imp/exp备份还原
  10. oracle 日期格式化 修改_java学习笔记:时间日期类
  11. 数据库工作笔记008---pg_hba.conf entry for host “192.168.2.111”, user “gpadmin”, database “template1”, SSL
  12. Leetcode杯 第三题解答(动态规划)
  13. Rabbit-音乐欣赏
  14. 仅需6步!虹科教你如何在第三方软件CODESYS中配置PCAN
  15. Selenium使用自带浏览器自动化
  16. 企业网络安全的重要性
  17. 打开chm文件提示“已取消到该网页的导航”的解决方案
  18. VS Code —— 介绍如何配置快捷代码片段和一些自用插件
  19. 《UNIX/LINUX系统管理I》课程学习总结
  20. 好佳居软装十大品牌 软装可以提升格调

热门文章

  1. red5安装时候出现服务不能启动异常
  2. Android数据存储——2.文件存储_B_资源文件
  3. SharePoint Project Item Replaceable Parameters
  4. 号召一下,看有多少人能响应!
  5. python socket server库_python基础之socket与socketserver
  6. macos windowserver占用内存_【v007】如何安装MAC OS的虚拟机系统(上)
  7. ajax返回去掉引号,为什么我的服务器代码ajax调用返回一个用双引号括起来的响应?...
  8. php4种九九乘法表编程,PHP 99乘法表的几种实现代码
  9. 基于java的InputStream.read(byte[] b,int off,int len)算法学习!
  10. b区计算机考研招不满的大学,B区又一所院校招收大量调剂!一志愿不满!