cation Failure
100.00 0.00 100.00 100.00 97.78 95.59 1906 26.575 61434 217672.991 217699.566 Allocation Failure Allocation Failure
100.00 0.00 100.00 100.00 97.78 95.59 1906 26.575 61434 217672.991 217699.566 Allocation Failure Allocation Failure
可以看到Old区满了,并且Eden区域的对象没有触发YGC直接晋升到Old区中,但是Full GC没有释放出空间。这是由于在当老年代的连续空间小于新生代所有对象大小时,MinorGC前会检查下平均每次晋升到Old区的大小是否大于Old区的剩余空间,如果大于或者当前的设置HandlePromotionFailure为false则直接触发FullGc,否则会先进行MinorGC。 关于FullGC和MajorGC的区别,可以不要太纠结.
jmap -histo 15178 | less 查看一下对象实例数量和空间占用 看到前面的一种数据各占用几百兆内存。总和在1935483656,和堆空间基本相同。
num #instances #bytes class name
----------------------------------------------
1: 14766305 796031864 [C
2: 14763842 354332208 java .lang.String
3: 8882440 213178560 java .lang.Long
4: 1984104 174601152 com.x.x.x.model.Order
5: 3994139 63906224 java.lang.Integer
6: 1984126 63492032 java.util.concurrent.FutureTask
7: 1984371 47624904 java.util.Date
8: 1984363 47624712 java.util.concurrent.LinkedBlockingQueue$Node
9: 1984114 47618736 java.util.concurrent.Executors$RunnableAdapter
10: 1984104 47618496 com.x.x.fyes.service.impl.OrderServiceImpl$$Lambda$11/284227593
11: 262144 18874368 org.apache.logging.log4j.core.async.RingBufferLogEvent
12: 7841 15312288 [B
13: 17412 8712392 [Ljava.lang.Object;
14: 262144 6291456 org.apache.logging.log4j.core.async.AsyncLoggerConfigHelper$Log4jEventWrapper
15: 12116 4299880 [I
16: 99594 3187008 java.util.HashMap$Node
17: 16318 1810864 java.lang.Class
18: 2496 1637376 io.netty.util.internal.shaded.org.jctools.queues.MpscArrayQueue
19: 49413 1185912 java.net.InetSocketAddress$InetSocketAddressHolder
20: 49322 1183728 java.net.InetAddress$InetAddressHolder
21: 49321 1183704 java.net.Inet4Address
22: 6116 1134384 [Ljava.util.HashMap$Node;
23: 49412 790592 java.net.InetSocketAddress
24: 6249 549912 java.lang.reflect.Method
25: 11440 457600 java.util.LinkedHashMap$Entry
26: 704 431264 [Ljava.util.WeakHashMap$Entry;
27: 12680 405760 java.util.concurrent.ConcurrentHashMap$Node
28: 6286 352016 java.util.LinkedHashMap
29: 9272 296704 java.lang.ref.WeakReference
30: 139 281888 [Ljava.nio.channels.SelectionKey;
31: 616 258464 [Ljava.util.concurrent.ConcurrentHashMap$Node;
32: 5709 228360 java.lang.ref.SoftReference
33: 3840 217944 [Ljava.lang.String;
34: 4493 215664 java.util.HashMap
35: 65 210040 [Ljava.nio.ByteBuffer;
36: 859 188144 [Z
37: 5547 177504 java.util.concurrent.locks.ReentrantLock$NonfairSync
38: 4391 175640 java.util.TreeMap$Entry
39: 404 174400 [Lio.netty.util.Recycler$DefaultHandle;
40: 4348 173920 java.util.WeakHashMap$Entry
41: 4096 163840 org.jboss.netty.util.internal.ConcurrentIdentityHashMap$Segment
42: 2033 162640 java.lang.reflect.Constructor
43: 6489 155736 java.util.ArrayList
44: 3750 150000 java.lang.ref.Finalizer
主要寻找这个列表中的业务对象和集合对象 其中的Order
和OrderServiceImpl$$Lambda$11/284227593
引起了我的注意。 找到该位置代码后,其代码为
private ExecutorService executorService = Executors.newFixedThreadPool(10, new DefaultThreadFactory("cacheThread"));
@Override
public Order save(Order order) {
order.setCreated(new Date(order.getCreateTime()));
Order save = orderRepository.save(order);
executorService.submit(() -> {
orderC