Jake Maes created SAMZA-966:
-------------------------------

             Summary: Performance: Remove finalizer from RocksDbIterator
                 Key: SAMZA-966
                 URL: https://issues.apache.org/jira/browse/SAMZA-966
             Project: Samza
          Issue Type: Bug
            Reporter: Jake Maes


It is well-known that finalizable objects hurt GC performance. Josh Bloch 
covers it in Effective Java. 

We have one finalizer in Samza for RocksDbIterator. This is bad because:
1. RocksDbIterators can be created and destroyed very frequently and making 
them disposable makes it harder for the nursery to clean them up. 
2. It's not necessary. Finalize calls close() which calls dispose() on 
RocksObject. The javaDoc for that method is pretty clear:
{quote}
/**
   * Release the c++ object manually pointed by the native handle.
   * <p>
   * Note that {@code dispose()} will also be called during the GC process
   * if it was not called before its {@code RocksObject} went out-of-scope.
   * However, since Java may wrongly wrongly assume those objects are
   * small in that they seems to only hold a long variable. As a result,
   * they might have low priority in the GC process.  To prevent this,
   * it is suggested to call {@code dispose()} manually.
   * </p>
   * <p>
   * Note that once an instance of {@code RocksObject} has been disposed,
   * calling its function will lead undefined behavior.
   * </p>
   */
{quote}
Sounds like the memory will eventually be freed. So we're paying a tax just to 
play big brother. 

Instead, I think we should document that KeyValueIterator should be always be 
closed, remove the finalizer from RocksDbIterator, and update KeyValueIterator 
to also extend Closeable, which will enable the try-with-resources pattern
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to