我正在尝试调优某种高负载的应用程序,它通过预处理将数据从一个云流到另一个云端。我的应用程序的具体特点是内存的广泛使用和较低的CPU消耗。我用j控制台监视了这个应用程序,并找到了一些有趣的图片-- cpu的加载率高达15%,而且我仍在捕捉内存不足的错误。
手动触发来自j控制台的“执行GC”将在所有代中清除大量内存,因此我假设应用程序中没有内存泄漏。
我的应用程序是在mesos/马拉松上运行的,所以我尝试用各种GCs (-XX:+UseG1GC;-XX:+UseParallelGC,无需其他调优)在单个虚拟CPU之间切换到多个CPU,并且图片实际上是一样的;
运行时度量:

系统配置:

发布于 2017-04-19 09:23:07
我想我应该把我的调查结果告诉大家。
“内存不足”--这是我从DevOps得到的东西--伙计,我首先想到的是-- OutOfMemoryException。所以,谢谢亚历克斯的clarifying question。
在我的例子中,它是来自底层操作系统的码头环境中的OOMKill。我为容器分配了1G,并将java堆大小限制为736米。但是我的应用程序使用netty,它通过堆分配自己的内存缓冲区。因此,当出现更多的连接时,netty分配了更多的直接缓冲区,这导致了OOMKill,尽管堆是健康的。
发布于 2017-04-19 09:55:36
当应用程序需要释放内存时,GC将运行。GC是昂贵的操作,只有在需要时才能运行。我不知道您为什么要将CPU利用率与运行GC联系起来。CPU利用率与运行GC应用程序无关。如果VM线程决定运行GC,它将暂停所有正在运行的应用程序线程(Safepointing),并允许GC执行操作,因此CPU Java的使用量保持不变,这与您剩下的CPU数量无关。
有许多GC标志可以用来完善您的应用程序,我将无法提出任何不确定您的应用程序到底是什么?
下面可能的链接将帮助您http://www.cubrid.org/blog/dev-platform/how-to-tune-java-garbage-collection/ https://confluence.atlassian.com/enterprise/garbage-collection-gc-tuning-guide-461504616.html
您应该知道在哪里可以获得OOM、老一代、Metaspace、Codegen或本机,因此可以使用堆选项进行微调。
https://stackoverflow.com/questions/43407713
复制相似问题