-
Notifications
You must be signed in to change notification settings - Fork 0
/
Main.java
75 lines (64 loc) · 2.43 KB
/
Main.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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;
public class Main {
final private static AtomicLong allocated = new AtomicLong(0L);
public static void main(String[] args) {
final int threads = Integer.parseInt(args[0]);
final int chunkSize = Integer.parseInt(args[1]) * 1024 * 1024;
final int chunkCount = Integer.parseInt(args[2]);
final ExecutorService pool = Executors.newFixedThreadPool(threads);
for (int i = 0; i < threads; i++) {
pool.execute(new MyThread(chunkSize, chunkCount,((i % 2) == 0 ? 30000L : 3600000L) ));
}
// give the threads a chance to startup
try {
Thread.sleep(2000L);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("pid " + CLibrary.INSTANCE.getpid()
+ " allocated " + threads + " threads"
+ " x chunkSize " + chunkSize / (1024 * 1024) + "MB"
+ " x chunkCount " + chunkCount + " = "
+ (allocated.get() / (1024 * 1024)) + "MB total");
System.out.flush();
}
private static long allocate(long size) {
return Native.malloc(size);
}
static class MyThread implements Runnable {
final int chunkSize;
final int chunkCount;
final long sleepMs;
public MyThread(final int chunkSize, final int chunkCount, final long sleepMs) {
this.chunkSize = chunkSize;
this.chunkCount = chunkCount;
this.sleepMs = sleepMs;
}
@Override
public void run() {
final long[] pointers = new long[chunkCount];
for (int i = 0; i < chunkCount; i++) {
pointers[i] = allocate(chunkSize);
allocated.getAndAdd(chunkSize);
new Pointer(pointers[i]).setMemory(0, chunkSize / 2, (byte) 0xfe);
}
try {
Thread.sleep(sleepMs);
} catch (Exception e) {
e.printStackTrace();
}
for (int i = 0; i < chunkCount; i++) {
Native.free(pointers[i]);
}
}
}
private interface CLibrary extends Library {
CLibrary INSTANCE = Native.load("c", CLibrary.class);
int getpid ();
}
}