Java 内存已满,GC需要很长时间 当上游接口变慢时,应用程序GC需要很长时间,并且没有响应。当我使用jstack pid时,线程被阻塞。 我们必须使用带有上游接口的hystrix断路器,以及可调用的接口。

Java 内存已满,GC需要很长时间 当上游接口变慢时,应用程序GC需要很长时间,并且没有响应。当我使用jstack pid时,线程被阻塞。 我们必须使用带有上游接口的hystrix断路器,以及可调用的接口。,java,Java,故障记忆信息如下: S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 100.00 100.00 92.82 89.17 122 306.980 4 276.454 583.434 下面是jmap实例: num #instances #bytes class name -------------------

故障记忆信息如下:

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00 100.00 100.00  92.82  89.17    122  306.980     4  276.454  583.434
下面是jmap实例:


 num     #instances         #bytes  class name
----------------------------------------------
   1:     137721956     3305326944  java.util.LinkedList$Node
   2:     137703668     2203258688  com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIgnoreExpression
我无法附加进度以获取线程信息:

jstack 1095
1095: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

首先,你必须检查你的坏代码

其次,您可以像这样使用垃圾收集器调用程序

@Component
public class GarbageCollectorInvoker {
    private final Logger logger = LoggerFactory.getLogger(GarbageCollectorInvoker.class);

    @Scheduled(cron = "0 0/30 * * * *")
    public void execute() {
        logger.warn("============GC Status B4=================");
        logger.warn("Heap size free (mb): " + Runtime.getRuntime().freeMemory() / 1024 / 1024);
        logger.warn("Heap size total (mb): " + Runtime.getRuntime().totalMemory() / 1024 / 1024);
        logger.warn("Heap size max (mb): " + Runtime.getRuntime().maxMemory() / 1024 / 1024);

        System.gc();

        logger.warn("============GC Status After=================");
        logger.warn("Heap size free (mb): " + Runtime.getRuntime().freeMemory() / 1024 / 1024);
    }
}

那么,在不了解应用程序的情况下,我们应该告诉您什么:使用更少的内存。这也可能有助于增加堆大小,但也可能是负面的。您可以添加更多关于应用程序的详细信息吗?它主要是下游api调用还是主要的处理量?您也在使用哪个GC,如果您有GC配置,请发布GC配置,包括频率。只要看一下压缩,GC实际上是主要的清理量。使用命令jstack pid,我发现所有线程都被阻塞了。
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1028096.0 990208.0  0.0    0.0   2176000.0 2176000.0 4194304.0  4193820.7  116992.0 108641.8 13312.0 11870.2    122  306.980  13   1515.771 1822.751
1028096.0 990208.0  0.0    0.0   2176000.0 2176000.0 4194304.0  4193820.7  116992.0 108641.8 13312.0 11870.2    122  306.980  13   1515.771 1822.751

 num     #instances         #bytes  class name
----------------------------------------------
   1:     137721956     3305326944  java.util.LinkedList$Node
   2:     137703668     2203258688  com.dangdang.ddframe.rdb.sharding.parsing.parser.expression.SQLIgnoreExpression
jstack 1095
1095: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

Server compiler detected.
JVM version is 25.65-b01

using thread-local object allocation.
Parallel GC with 38 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 8589934592 (8192.0MB)
   NewSize                  = 4294967296 (4096.0MB)
   MaxNewSize               = 4294967296 (4096.0MB)
   OldSize                  = 4294967296 (4096.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 536870912 (512.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 2228224000 (2125.0MB)
   used     = 2228201192 (2124.9782485961914MB)
   free     = 22808 (0.02175140380859375MB)
   99.99897640452666% used
From Space:
   capacity = 1052770304 (1004.0MB)
   used     = 0 (0.0MB)
   free     = 1052770304 (1004.0MB)
   0.0% used
To Space:
   capacity = 1013972992 (967.0MB)
   used     = 0 (0.0MB)
   free     = 1013972992 (967.0MB)
   0.0% used
PS Old Generation
   capacity = 4294967296 (4096.0MB)
   used     = 4294824496 (4095.863815307617MB)
   free     = 142800 (0.1361846923828125MB)
   99.99667517840862% used
@Component
public class GarbageCollectorInvoker {
    private final Logger logger = LoggerFactory.getLogger(GarbageCollectorInvoker.class);

    @Scheduled(cron = "0 0/30 * * * *")
    public void execute() {
        logger.warn("============GC Status B4=================");
        logger.warn("Heap size free (mb): " + Runtime.getRuntime().freeMemory() / 1024 / 1024);
        logger.warn("Heap size total (mb): " + Runtime.getRuntime().totalMemory() / 1024 / 1024);
        logger.warn("Heap size max (mb): " + Runtime.getRuntime().maxMemory() / 1024 / 1024);

        System.gc();

        logger.warn("============GC Status After=================");
        logger.warn("Heap size free (mb): " + Runtime.getRuntime().freeMemory() / 1024 / 1024);
    }
}