Unregister ShutdownHook when GC#PidLock is closed
Otherwise the JVM will accumulate the ShutdownHook objects of all GCs run while the JVM is up. Change-Id: Iadc723a939238a3a75b4ba47f898918eb4554ea3
This commit is contained in:
parent
e908e297db
commit
f94be665f1
|
@ -1799,6 +1799,8 @@ private class PidLock implements AutoCloseable {
|
||||||
|
|
||||||
private FileChannel channel;
|
private FileChannel channel;
|
||||||
|
|
||||||
|
private Thread cleanupHook;
|
||||||
|
|
||||||
PidLock() {
|
PidLock() {
|
||||||
pidFile = repo.getDirectory().toPath().resolve(GC_PID);
|
pidFile = repo.getDirectory().toPath().resolve(GC_PID);
|
||||||
}
|
}
|
||||||
|
@ -1827,9 +1829,9 @@ boolean lock() throws IOException {
|
||||||
}
|
}
|
||||||
channel.write(ByteBuffer
|
channel.write(ByteBuffer
|
||||||
.wrap(getProcDesc().getBytes(StandardCharsets.UTF_8)));
|
.wrap(getProcDesc().getBytes(StandardCharsets.UTF_8)));
|
||||||
Thread cleanupHook = new Thread(() -> close());
|
|
||||||
try {
|
try {
|
||||||
Runtime.getRuntime().addShutdownHook(cleanupHook);
|
Runtime.getRuntime().addShutdownHook(
|
||||||
|
cleanupHook = new Thread(() -> close()));
|
||||||
} catch (IllegalStateException e) {
|
} catch (IllegalStateException e) {
|
||||||
// ignore - the VM is already shutting down
|
// ignore - the VM is already shutting down
|
||||||
}
|
}
|
||||||
|
@ -1901,6 +1903,13 @@ private String getHostName() {
|
||||||
public void close() {
|
public void close() {
|
||||||
boolean wasLocked = false;
|
boolean wasLocked = false;
|
||||||
try {
|
try {
|
||||||
|
if (cleanupHook != null) {
|
||||||
|
try {
|
||||||
|
Runtime.getRuntime().removeShutdownHook(cleanupHook);
|
||||||
|
} catch (IllegalStateException e) {
|
||||||
|
// ignore - the VM is already shutting down
|
||||||
|
}
|
||||||
|
}
|
||||||
if (lock != null && lock.isValid()) {
|
if (lock != null && lock.isValid()) {
|
||||||
lock.release();
|
lock.release();
|
||||||
wasLocked = true;
|
wasLocked = true;
|
||||||
|
|
Loading…
Reference in New Issue