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)

Reply via email to