自动化GC的一个优点是开发人员不需要真正了解它是如何工作的。不幸的是,这意味着许多开发人员不了解它是如何工作的。了解垃圾收集和许多可用的GC,有点像了解Linux CLI命令。从技术上讲,你不需要使用它们,但是了解并习惯使用它们会对你的生产力产生重大影响。

与CLI命令一样,有一些绝对的基础。ls命令查看父文件夹中的文件夹列表,mv命令将文件从一个位置移动到另一个位置,等等。在GC中,这些命令相当于知道有多个GC可供选择,并且GC可能会导致性能问题。当然,还有很多东西需要学习(关于使用Linux CLI和垃圾收集)。

学习Java的垃圾收集过程的目的是为了学习如何有效地实现和维护适合你特定环境的具有最佳性能的正确GC。了解垃圾收集会影响应用程序性能是最基本的,有许多高级技术可以提高GC性能并减少其对应用程序可靠性的影响。

GC性能问题

1. 内存泄漏

通过了解堆结构和垃圾收集的执行方式,我们知道内存使用量会逐渐增加,直到发生垃圾收集事件并且使用量下降为止。被引用对象的堆利用率通常保持稳定,因此丢弃的卷应该大致相同。

在内存泄漏的情况下,每个GC事件都会清除一小部分堆对象(尽管留下的许多对象未被使用),因此堆利用率将继续增加,直到堆内存已满,并引发OutOfMemoryError异常,原因是GC只将未引用的对象标记为删除,因此,即使引用的对象不再使用,它也不会从堆中清除。

2. 持续的“Stop the World”事件

在某些场景中,垃圾收集可以调用Stop the World事件,因为当它发生时,JVM中的所有线程(以及在其上运行的应用程序)都将停止,以允许GC执行。在健康的应用程序中,GC执行时间相对较短,对应用程序性能影响不大。

但是,在不太理想的情况下,Stop the World事件可能会极大地影响应用程序的性能和可靠性。如果GC事件需要Stop the World暂停并需要2秒钟执行,则该应用程序的最终用户将在运行该应用程序的线程停止以允许GC时经历2秒钟的延迟。通过java培训学习,可以帮助你更好地了解垃圾回收相关问题,提高代码质量。

当内存泄漏发生时,连续Stop the World事件也是有问题的。由于每次执行GC都会清除较少的堆内存空间,因此剩余内存填满所需的时间更短。当内存已满时,JVM会触发另一个GC事件。最终,JVM将反复运行Stop the World事件,从而引起重大性能问题。

3. CPU使用率

这一切都取决于CPU的使用。连续GC/Stop the World事件的一个主要症状是CPU使用量激增。GC是一个计算量很大的操作,因此可能需要占用更多的CPU资源。对于运行并发线程的GC,CPU使用率甚至更高。为您的应用程序选择正确的GC将对CPU使用产生最大的影响,但也有其他方法可以在这方面优化以获得更好的性能。

我们可以从围绕垃圾收集的这些性能问题中了解到,无论GCs系统变得多么先进(而且越来越先进),它们的致命弱点仍然是一样的:冗余和不可预测的对象分配。要提高应用程序性能,选择正确的GC是不够的。我们需要知道这个过程是如何工作的,我们需要优化我们的代码,这样我们的GCs就不会占用过多的资源,或者在我们的应用程序中造成过多的暂停。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部