当前位置: 首页 > 面试题库 >

手动GC调用的用例?

姬安志
2023-03-14
问题内容

我已经读过为什么调用System.gc()以及许多其他方法是一种不好的做法,例如,这描述了确实造成了灾难性的滥用System.gc()。但是,在某些情况下,GC花费的时间太长,避免了长时间的停顿,例如,避免垃圾并不是一件容易的事,并且使代码难以维护。

在以下常见情况下,恕我直言,手动调用GC很好:

  • 有多个可互换的Webserve,它们前面都有一个故障转移。
  • 每个服务器使用几GB的堆,STW暂停花费的时间比平均请求长得多。
  • 故障转移不知道何时发生GC。
  • 根据提示,故障转移可以免除服务器。

该算法似乎很简单:定期选择服务器,不要再向它发送任何请求,让它完成其正在运行的请求,让它执行其GC,然后重新激活服务器。

我想知道我是否想念什么?1,2

有哪些选择?

  1. 长时间运行的请求可能是一个问题,但让我们假设没有请求。或者只是将等待时间限制在与GC相当的时间。发出缓慢的请求甚至变得更慢听起来并不坏。

  2. 诸如此类的选项-XX:+DisableExplicitGC可能会使算法无用,但不要使用它(我的用例包括我负责的专用服务器)。


问题答案:

对于低延迟交易系统,我以非典型方式使用GC。

您要避免在交易日收集任何款项,即使是次要款项也是如此。一种方法是每秒创建少于300 KB的垃圾。每小时大约1 GB,或者每天最多24 GB。当您使用24
GB
Eden空间时,这意味着没有次要/主要GC。但是,为确保GC在计划的可接受时间内发生,System.gc()每天早上5点叫a,第二天您将有一个干净的伊甸园空间。

有时,您创建的垃圾多于预期,例如无法重新连接到数据源,并且可能会获得少量的次要收集。但是,只有在出现问题时才会发生这种情况。

有关更多详细信息,请访问http://vanillajava.blogspot.co.uk/2011/06/how-to-avoid-garbage-
collection.html

通过避免垃圾并不完全是琐碎的事情,并使代码难以维护。

完全避免垃圾几乎是不可能的。但是,对于JVM而言,300 KB / s并不难。(如今,在一台具有24 GB Eden空间的计算机上,您可以拥有多个JVM)

请注意,如果您可以将垃圾保持在50 KB / s以下,则可以在没有GC的情况下运行整周。

定期选择服务器,不让其他请求发送给它,让它完成正在运行的请求,让它执行其GC,然后重新激活该服务器。

您可以将GC视为无法满足SLA条件。在这种情况下,您可以在确定将要从群集中删除服务器时将其删除,并对其进行Full GC并将其返回到群集中。



 类似资料:
  • 一般来说,使用Unity引擎开发的项目中,其内存分配主要由三部分组成:程序代码、托管堆(Managed Heap)以及本机堆(Native Heap)。其中,对于目前绝大多数基于Unity引擎开发的项目而言,其托管堆是由Mono分配和管理的。“托管” 的本意是Mono可以自动地改变堆的大小来适应你所需要的内存,并且适时地调用垃圾回收(Garbage Collection)操作来释放已经不需要的内存

  • 问题内容: 如何通过自己的代码手动调用特定事件? 问题答案: 我认为您想要wx.PostEvent。 在wxPython Wiki上 还有一些有关从其他线程发布事件以执行长期运行任务的信息。

  • Datatables插件中的footerCallback函数有问题。 我的表格列出了历史发票。用户可以选中每个表行上的复选框,将发票总额添加到同一行的隐藏列中。 我正在使用脚注回调函数来总结隐藏列中的值。 问题是,footerCallback函数仅在初始页面加载时执行。我需要在每次复选框检查后执行该函数,以便页脚中显示的总和适当更新。 HTML CSS jQuery 我在下面制作了一把小提琴: h

  • 问题内容: 我正在使用Hibernate和Spring Annotations进行很多验证,如下所示: 然后在控制器中,在参数中调用它: 但是我想根据控制器方法中的某些逻辑来决定使用的组。有没有办法手动调用验证?像什么? 我知道要创建自己的Validator类,但是这是我要避免的事情,我宁愿只在类变量本身上使用批注。 问题答案: 比 Jaiwo99 更进一步: 如果您有兴趣,还可以指向SmartV

  • 问题是将作为参数,根据文档,该参数是“RecyclerView正在绘制其子级的画布”。有没有办法从中获取画布?如果执行,则会执行代码,但在ViewWholder后面没有绘制任何内容,因为它显然不是recyclerview使用的画布...也许有办法设置一个canvas供recyclerview使用吗? 谢谢你的正手点子。

  • 问题内容: 我试图避免Full GC(来自下面的gc.log示例)在生产中的Tomcat中运行Grails应用程序。关于如何更好地配置GC的任何建议? 14359.317:[完整GC 14359.317:[CMS:3453285K- > 3099828K(4194304K),13.1778420秒] 4506618K-> 3099828K(6081792K),[CMS彼尔姆:261951K-> 1