如第二小节所讲: 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带来的对应用程序的影响最小化。这也是应用程序性能优化的一种方式之一。
期待您的关注
-
博主最近新写了一本书:《手摸手教您学习SpringBoot系列-16章97节》
-
本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
总结
在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了
握的,我也把这些知识点都整理起来了
[外链图片转存中…(img-CVlIG8IB-1714368111165)]
[外链图片转存中…(img-YCsY8e0Q-1714368111165)]