Skip to content

Commit aaeacb5

Browse files
committed
release ByteBuf off heap memory block
1 parent d9cf408 commit aaeacb5

16 files changed

+124
-4
lines changed

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/allocator/MemoryAllocator.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,7 @@ public interface MemoryAllocator {
2323

2424
Object forceAllocate(long size);
2525

26-
void releaseMemory(long size);
26+
void returnMemoryToManager(long size);
27+
28+
void releaseMemoryBlock(Object memoryBlock);
2729
}

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/allocator/NettyMemoryAllocator.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import io.netty.buffer.ByteBuf;
2323
import io.netty.buffer.PooledByteBufAllocator;
24+
import io.netty.util.ReferenceCountUtil;
2425

2526
/**
2627
* This class makes fully use of Netty's efficient memory management strategy.
@@ -50,7 +51,24 @@ public ByteBuf tryToAllocate(long size) {
5051
}
5152

5253
@Override
53-
public void releaseMemory(long size) {
54+
public void returnMemoryToManager(long size) {
5455
memoryManager.getCurrentOffHeapAllocatedMemory().addAndGet(-size);
5556
}
57+
58+
@Override
59+
public void releaseMemoryBlock(Object memoryBlock) {
60+
if (!(memoryBlock instanceof ByteBuf)) {
61+
throw new IllegalArgumentException("memoryBlock must be ByteBuf");
62+
}
63+
ByteBuf buf = (ByteBuf) memoryBlock;
64+
ReferenceCountUtil.safeRelease(buf, ReferenceCountUtil.refCnt(buf));
65+
}
66+
67+
public static void main(String[] args) {
68+
MemoryAllocator netty = new NettyMemoryAllocator(null);
69+
ByteBuf buf = (ByteBuf) netty.forceAllocate(1024);
70+
System.out.println(ReferenceCountUtil.refCnt(buf));
71+
netty.releaseMemoryBlock(buf);
72+
System.out.println(ReferenceCountUtil.refCnt(buf));
73+
}
5674
}

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/allocator/OnHeapMemoryStrategy.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,12 @@ public byte[] forceAllocate(long size) {
4848
}
4949

5050
@Override
51-
public void releaseMemory(long size) {
51+
public void returnMemoryToManager(long size) {
5252
memoryManager.getCurrentOnHeapAllocatedMemory().addAndGet(-size);
5353
}
54+
55+
@Override
56+
public void releaseMemoryBlock(Object memoryBlock) {
57+
memoryBlock = null;
58+
}
5459
}

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/MemoryConsumer.java

+6
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
package org.apache.hugegraph.memory.consumer;
1919

20+
import java.util.List;
21+
2022
import org.apache.hugegraph.memory.pool.MemoryPool;
2123

24+
import io.netty.buffer.ByteBuf;
25+
2226
/**
2327
* This interface is used by immutable, memory-heavy objects which will be stored in off heap.
2428
*/
@@ -44,4 +48,6 @@ public interface MemoryConsumer {
4448
void releaseOriginalOnHeapVars();
4549

4650
MemoryPool getOperatorMemoryPool();
51+
52+
List<ByteBuf> getAllOffHeapByteBuf();
4753
}

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/BinaryIdOffHeap.java

+8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717

1818
package org.apache.hugegraph.memory.consumer.impl.id;
1919

20+
import java.util.Collections;
21+
import java.util.List;
22+
2023
import org.apache.hugegraph.backend.id.Id;
2124
import org.apache.hugegraph.backend.serializer.BinaryBackendEntry;
2225
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
@@ -59,6 +62,11 @@ public MemoryPool getOperatorMemoryPool() {
5962
return this.memoryPool;
6063
}
6164

65+
@Override
66+
public List<ByteBuf> getAllOffHeapByteBuf() {
67+
return Collections.singletonList(bytesOffHeap);
68+
}
69+
6270
@Override
6371
public void releaseOriginalOnHeapVars() {
6472
this.bytes = null;

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/EdgeIdOffHeap.java

+8
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.hugegraph.memory.consumer.impl.id;
1919

2020
import java.nio.charset.StandardCharsets;
21+
import java.util.List;
2122
import java.util.Objects;
2223

2324
import org.apache.hugegraph.backend.id.EdgeId;
@@ -29,6 +30,8 @@
2930
import org.apache.hugegraph.structure.HugeVertex;
3031
import org.apache.hugegraph.type.define.Directions;
3132

33+
import com.google.common.collect.Lists;
34+
3235
import io.netty.buffer.ByteBuf;
3336

3437
// TODO: rewrite static method in EdgeId
@@ -140,6 +143,11 @@ public MemoryPool getOperatorMemoryPool() {
140143
return memoryPool;
141144
}
142145

146+
@Override
147+
public List<ByteBuf> getAllOffHeapByteBuf() {
148+
return Lists.newArrayList(this.sortValuesOffHeap, this.cacheOffHeap);
149+
}
150+
143151
@Override
144152
public EdgeId switchDirection() {
145153
Directions newDirection = this.direction.opposite();

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/LongIdOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
import static org.apache.hugegraph.backend.id.IdGenerator.compareType;
2121

22+
import java.util.Collections;
23+
import java.util.List;
2224
import java.util.Objects;
2325

2426
import org.apache.hugegraph.backend.id.Id;
@@ -75,6 +77,11 @@ public MemoryPool getOperatorMemoryPool() {
7577
return memoryPool;
7678
}
7779

80+
@Override
81+
public List<ByteBuf> getAllOffHeapByteBuf() {
82+
return Collections.singletonList(idOffHeap);
83+
}
84+
7885
@Override
7986
public long asLong() {
8087
try {

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/ObjectIdOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.hugegraph.memory.consumer.impl.id;
1919

20+
import java.util.Collections;
21+
import java.util.List;
2022
import java.util.Objects;
2123

2224
import org.apache.hugegraph.backend.id.IdGenerator;
@@ -63,6 +65,11 @@ public MemoryPool getOperatorMemoryPool() {
6365
return memoryPool;
6466
}
6567

68+
@Override
69+
public List<ByteBuf> getAllOffHeapByteBuf() {
70+
return Collections.singletonList(objectOffHeap);
71+
}
72+
6673
@Override
6774
public Object asObject() {
6875
return FurySerializationUtils.FURY.deserialize(ByteBufUtil.getBytes(objectOffHeap));

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/QueryIdOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
package org.apache.hugegraph.memory.consumer.impl.id;
1919

2020
import java.nio.charset.StandardCharsets;
21+
import java.util.Collections;
22+
import java.util.List;
2123

2224
import org.apache.hugegraph.backend.cache.CachedBackendStore;
2325
import org.apache.hugegraph.backend.id.Id;
@@ -69,6 +71,11 @@ public MemoryPool getOperatorMemoryPool() {
6971
return memoryPool;
7072
}
7173

74+
@Override
75+
public List<ByteBuf> getAllOffHeapByteBuf() {
76+
return Collections.singletonList(queryOffHeap);
77+
}
78+
7279
@Override
7380
public boolean equals(Object other) {
7481
if (!(other instanceof QueryIdOffHeap)) {

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/StringIdOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import static org.apache.hugegraph.backend.id.IdGenerator.compareType;
2121

2222
import java.nio.charset.StandardCharsets;
23+
import java.util.Collections;
24+
import java.util.List;
2325

2426
import org.apache.hugegraph.backend.id.Id;
2527
import org.apache.hugegraph.backend.id.IdGenerator;
@@ -75,6 +77,11 @@ public MemoryPool getOperatorMemoryPool() {
7577
return memoryPool;
7678
}
7779

80+
@Override
81+
public List<ByteBuf> getAllOffHeapByteBuf() {
82+
return Collections.singletonList(idOffHeap);
83+
}
84+
7885
@Override
7986
public Object asObject() {
8087
return this.asString();

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/id/UuidIdOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import static org.apache.hugegraph.backend.id.IdGenerator.compareType;
2121

2222
import java.io.IOException;
23+
import java.util.Collections;
24+
import java.util.List;
2325
import java.util.UUID;
2426

2527
import org.apache.hugegraph.backend.id.Id;
@@ -87,6 +89,11 @@ public MemoryPool getOperatorMemoryPool() {
8789
return memoryPool;
8890
}
8991

92+
@Override
93+
public List<ByteBuf> getAllOffHeapByteBuf() {
94+
return Collections.singletonList(idOffHeap);
95+
}
96+
9097
@Override
9198
public Object asObject() {
9299
return FurySerializationUtils.FURY.deserialize(

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/property/HugeEdgePropertyOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.hugegraph.memory.consumer.impl.property;
1919

20+
import java.util.Collections;
21+
import java.util.List;
2022
import java.util.NoSuchElementException;
2123

2224
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
@@ -68,6 +70,11 @@ public MemoryPool getOperatorMemoryPool() {
6870
return memoryPool;
6971
}
7072

73+
@Override
74+
public List<ByteBuf> getAllOffHeapByteBuf() {
75+
return Collections.singletonList(valueOffHeap);
76+
}
77+
7178
@Override
7279
public HugeEdgeProperty<V> switchEdgeOwner() {
7380
assert this.owner instanceof HugeEdge;

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/consumer/impl/property/HugeVertexPropertyOffHeap.java

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
package org.apache.hugegraph.memory.consumer.impl.property;
1919

20+
import java.util.Collections;
21+
import java.util.List;
2022
import java.util.NoSuchElementException;
2123

2224
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
@@ -67,6 +69,11 @@ public MemoryPool getOperatorMemoryPool() {
6769
return memoryPool;
6870
}
6971

72+
@Override
73+
public List<ByteBuf> getAllOffHeapByteBuf() {
74+
return Collections.singletonList(valueOffHeap);
75+
}
76+
7077
@Override
7178
public Object serialValue(boolean encodeNumber) {
7279
return this.pkey.serialValue(this.value(), encodeNumber);

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/pool/AbstractMemoryPool.java

+6
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.util.concurrent.locks.ReentrantLock;
2626

2727
import org.apache.hugegraph.memory.MemoryManager;
28+
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
2829
import org.apache.hugegraph.memory.pool.impl.MemoryPoolStats;
2930
import org.slf4j.Logger;
3031
import org.slf4j.LoggerFactory;
@@ -139,6 +140,11 @@ public Object tryToAcquireMemoryInternal(long bytes) {
139140
return null;
140141
}
141142

143+
@Override
144+
public void bindMemoryConsumer(MemoryConsumer memoryConsumer) {
145+
// default do nothing
146+
}
147+
142148
@Override
143149
public Object requireMemory(long bytes) {
144150
return null;

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/pool/MemoryPool.java

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
package org.apache.hugegraph.memory.pool;
1919

20+
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
2021
import org.apache.hugegraph.memory.pool.impl.MemoryPoolStats;
2122
import org.apache.hugegraph.memory.util.QueryOutOfMemoryException;
2223

@@ -49,4 +50,6 @@ public interface MemoryPool {
4950
MemoryPool getParentPool();
5051

5152
MemoryPool findRootQueryPool();
53+
54+
void bindMemoryConsumer(MemoryConsumer memoryConsumer);
5255
}

hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/memory/pool/impl/OperatorMemoryPool.java

+16-1
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,12 @@
1717

1818
package org.apache.hugegraph.memory.pool.impl;
1919

20+
import java.util.HashSet;
21+
import java.util.Set;
22+
2023
import org.apache.hugegraph.memory.MemoryManager;
2124
import org.apache.hugegraph.memory.allocator.MemoryAllocator;
25+
import org.apache.hugegraph.memory.consumer.MemoryConsumer;
2226
import org.apache.hugegraph.memory.pool.AbstractMemoryPool;
2327
import org.apache.hugegraph.memory.pool.MemoryPool;
2428
import org.apache.hugegraph.memory.util.MemoryManageUtils;
@@ -30,16 +34,27 @@ public class OperatorMemoryPool extends AbstractMemoryPool {
3034

3135
private static final Logger LOG = LoggerFactory.getLogger(OperatorMemoryPool.class);
3236
private final MemoryAllocator memoryAllocator;
37+
private final Set<MemoryConsumer> memoryConsumers;
3338

3439
public OperatorMemoryPool(MemoryPool parent, String poolName,
3540
MemoryAllocator memoryAllocator, MemoryManager memoryManager) {
3641
super(parent, poolName, memoryManager);
3742
this.memoryAllocator = memoryAllocator;
43+
this.memoryConsumers = new HashSet<>();
44+
}
45+
46+
@Override
47+
public void bindMemoryConsumer(MemoryConsumer memoryConsumer) {
48+
this.memoryConsumers.add(memoryConsumer);
3849
}
3950

4051
@Override
4152
public synchronized void releaseSelf(String reason) {
42-
this.memoryAllocator.releaseMemory(getAllocatedBytes());
53+
this.memoryAllocator.returnMemoryToManager(getAllocatedBytes());
54+
this.memoryConsumers.forEach(memoryConsumer -> {
55+
memoryConsumer.getAllOffHeapByteBuf().forEach(memoryAllocator::releaseMemoryBlock);
56+
});
57+
this.memoryConsumers.clear();
4358
super.releaseSelf(reason);
4459
// TODO: release memory consumer, release byte buffer.
4560
}

0 commit comments

Comments
 (0)