-
Notifications
You must be signed in to change notification settings - Fork 0
/
Heapz.java
39 lines (31 loc) · 1.21 KB
/
Heapz.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
public class Heapz {
private static final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
private static final ReentrantLock samplingInProgress = new ReentrantLock();
public static void shutdown() {
executor.shutdown();
}
public static Future<byte[]> sampleFor(int seconds) {
Heapz.startSampling();
return executor.schedule(() -> {
var locked = false;
try {
Heapz.stopSampling();
if (!(locked = samplingInProgress.tryLock())) {
throw new IllegalStateException("Sampling already in progress");
}
return Heapz.getResults();
} finally {
if (locked) samplingInProgress.unlock();
}
}, seconds, TimeUnit.SECONDS);
}
// Implemented in heapz.cc
public static native void startSampling();
public static native void stopSampling();
public static native byte[] getResults();
}