--- old/src/java.base/share/classes/java/util/zip/Inflater.java 2017-11-01 12:54:19.332174020 +0100 +++ new/src/java.base/share/classes/java/util/zip/Inflater.java 2017-11-01 12:54:19.210176098 +0100 @@ -66,6 +66,20 @@ * } * * + *

+ * @apiNote + * In earlier versions the {@link Object#finalize} method was overridden and + * specified to call the {@code end} method to close the {@code inflater} and + * release the resource when the instance becomes unreachable. + * The {@code finalize} method is no longer defined. The recommended cleanup + * for decompressor is to explicitly call {@code end} method when it is no + * longer in use. + * + * @implNote + * The resource of the decompressor will be released when the instance becomes + * phantom-reachable, if the {@code end} is not invoked explicitly. + *

+ * * @see Deflater * @author David Connelly * @since 1.1 @@ -101,7 +115,7 @@ * @param nowrap if true then support GZIP compatible compression */ public Inflater(boolean nowrap) { - zsRef = new ZStreamRef(init(nowrap)); + this.zsRef = new ZStreamRef(this, () -> init(nowrap), Inflater::end); } /** @@ -361,39 +375,18 @@ /** * Closes the decompressor and discards any unprocessed input. + * * This method should be called when the decompressor is no longer - * being used, but will also be called automatically by the finalize() - * method. Once this method is called, the behavior of the Inflater - * object is undefined. + * being used. Once this method is called, the behavior of the + * Inflater object is undefined. */ public void end() { synchronized (zsRef) { - long addr = zsRef.address(); - zsRef.clear(); - if (addr != 0) { - end(addr); - buf = null; - } + zsRef.clean(); + buf = null; } } - /** - * Closes the decompressor when garbage is collected. - * - * @deprecated The {@code finalize} method has been deprecated. - * Subclasses that override {@code finalize} in order to perform cleanup - * should be modified to use alternative cleanup mechanisms and - * to remove the overriding {@code finalize} method. - * When overriding the {@code finalize} method, its implementation must explicitly - * ensure that {@code super.finalize()} is invoked as described in {@link Object#finalize}. - * See the specification for {@link Object#finalize()} for further - * information about migration options. - */ - @Deprecated(since="9") - protected void finalize() { - end(); - } - private void ensureOpen () { assert Thread.holdsLock(zsRef); if (zsRef.address() == 0)