你们中的一些人可能知道一些核心java API会对System.gc()进行显式调用.发生这种情况时我知道两种情况:
所以,问题是:
我有以下情况:有几台机器组成一个集群.客户端可以加载数据集,我们需要选择将加载数据集的节点,如果没有一台机器可以适合数据集,则拒绝加载/避免OOM错误.
我们当前所做的事情:我们现在entry count在数据集中估算memory to be usedas entry count * empirical factor(手动确定).然后检查它是否低于空闲内存(得到Runtime.freeMemory()),如果是,则加载它(否则重做其他节点上的进程/报告没有空闲容量).
这种方法的问题是:
empirical factor需要被重新和手动更新freeMemory有时可能会因为一些未清理的垃圾而少报(这可以通过System.gc在每次这样的通话之前运行来避免,但这会减慢服务器的速度并且还可能导致过早的促销)这个问题有更好的解决方案吗?
我们正在构建一个具有激进性能 SLA 的 Web 应用程序,由于 System.gc() 调用导致 JVM 出去吃午饭,这些 SLA 会定期被违反。我们已经进行了一些调试,并确定在所有情况下都是内部应用服务器代码在调用 System.gc()。这种情况在应用服务器启动或应用程序部署时会发生几次,我们并不关心这些。但是,当应用程序启动并通过内部应用程序服务器调用 NIO 类运行时,也会定期触发 System.gc()。这是我们能够捕获此事件的堆栈跟踪:
3XMTHREADINFO "WebContainer : 25" J9VMThread:0x0000000006FC5D00, j9thread_t:0x00007F60E41753E0, java/lang/Thread:0x000000060B735590, state:R, prio=5
3XMJAVALTHREAD (java/lang/Thread getId:0xFE, isDaemon:true)
3XMTHREADINFO1 (native thread ID:0x1039, native priority:0x5, native policy:UNKNOWN)
3XMTHREADINFO2 (native stack address range from:0x00007F6067621000, to:0x00007F6067662000, size:0x41000)
3XMCPUTIME CPU usage total: 80.222215853 secs
3XMHEAPALLOC Heap bytes allocated since last GC cycle=1594568 (0x1854C8)
3XMTHREADINFO3 Java callstack:
4XESTACKTRACE at java/lang/System.gc(System.java:329)
4XESTACKTRACE at java/nio/Bits.syncReserveMemory(Bits.java:721)
5XESTACKTRACE (entered lock: java/nio/Bits@0x000000060000B690, entry count: 1)
4XESTACKTRACE at java/nio/Bits.reserveMemory(Bits.java:766(Compiled Code))
4XESTACKTRACE …Run Code Online (Sandbox Code Playgroud)