Kezhu Wang created FLINK-21753:
----------------------------------
Summary: Cycle references between memory manager and gc cleaner
action
Key: FLINK-21753
URL: https://issues.apache.org/jira/browse/FLINK-21753
Project: Flink
Issue Type: Bug
Components: Runtime / Task
Affects Versions: 1.12.2, 1.11.3, 1.10.3
Reporter: Kezhu Wang
{{MemoryManager.allocatePages}} uses {{this::releasePage}} as cleanup action in
{{MemorySegmentFactory.allocateOffHeapUnsafeMemory}}. The cleanup function is
used as gc cleaner action there. This creates a cycle referencing between
memory manager and gc cleaner *if allocated memory segment is not
{{MemoryManager.release}} in time.* Symptoms should be different based on
versions:
* Before 1.12.2: memory will not be reclaimed until gc after
{{MemoryManager.release}}
* * 1.12.2: memory will not be reclaimed until {{MemorySegment.free}} or gc
after {{MemoryManager.release}}
I quotes javadoc from jdk {{java.lang.ref.Cleaner}} here for references:
{quote}The cleaning action is invoked only after the associated object becomes
phantom reachable, so it is important that the object implementing the cleaning
action does not hold references to the object. In this example, a static class
encapsulates the cleaning state and action. An "inner" class, anonymous or not,
must not be used because it implicitly contains a reference to the outer
instance, preventing it from becoming phantom reachable. The choice of a new
cleaner or sharing an existing cleaner is determined by the use case.
{quote}
See also FLINK-13985 FLINK-21419.
I pushed [test
case|https://github.com/kezhuw/flink/commit/9a5d71d3a6be50611cf2f5c65c39f51353167306]
in my repository after FLINK-21419 (which merged in 1.12.2 but not before) for
evaluation.
cc [~azagrebin] [~xintongsong] [~trohrmann] [~ykt836] [~nicholasjiang]
--
This message was sent by Atlassian Jira
(v8.3.4#803005)