DEV Community

Buddhika Chathuranga
Buddhika Chathuranga

Posted on

4

Java finalize() is danger

In every Java object, there is a method called finalize(). You can override this method in any of your classes. The purpose of this method was to implement clean-up codes. When the object is garbage collected by the garbage collector, the garbage collector will invoke this method.

But no one can ensure whether the garbage collector will get a chance to invoke that method. Because we can't force to run the garbage collector even by calling System.GC().

Refer to the following code.

public class Demo{
  private DBConnection dbcon;

  public Demo(DBConnection con){
    this.dbcon = con;
  }

  @Override
  finalize(){
    this.dbcon.close();
  }

  public static void main(String[] args){
    for(int i = 0; i < 1000000; i++){
       Demo demo = new Demo(
         new DBConnection("credentials")
       );
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

A million database connections will be opened when we run this code, but the connection closing logic is implemented inside the finalize method. Since no one can ensure that the garbage collector will trigger before the application ends, a million database connections may be wasted.

So it is not recommended to override the finalize method. Especially when you want to implement a critical piece of code inside the finalize method.

Because of this, Java has deprecated the finalize method from version 9. But still, if you want to do this, there are few workarounds that you can take.

1. Register a shutdownhook

You can use shutdownhook to execute things like resource cleanups, closing log files, etc. Shutdownhook will be executed by the JVM before shutting down the JVM. You can register as many as shutdownhooks you want and those will be executed concurrently, and you can't tell what order it will be executed.

2. Using PhamtomReference

A phantom reference is a kind of reference in Java, where the memory can be reclaimed. The phantom reference is one of the strengths or levels of 'non-strong' reference defined in the Java programming language; the others being weak and soft.

This is the same definition from Wikipedia about the phantom reference in Java. I have no much clarity about phantom reference. Maybe I will explain this will in another article.
Until that https://www.baeldung.com/java-phantom-reference will help you ;).

Image of Datadog

The Future of AI, LLMs, and Observability on Google Cloud

Datadog sat down with Google’s Director of AI to discuss the current and future states of AI, ML, and LLMs on Google Cloud. Discover 7 key insights for technical leaders, covering everything from upskilling teams to observability best practices

Learn More

Top comments (0)

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free