3 import java.util.HashMap;
4 import java.util.Map.Entry;
5 import java.util.concurrent.atomic.AtomicInteger;
8 * Information object return by the Garbage collector. This allow the user to
9 * monitor what kind of vtkObject and how many have been removed and kept during
10 * the Garbage collection call.
12 * @author sebastien jourdain - sebastien.jourdain@kitware.com
14 public class vtkReferenceInformation {
15 private int numberOfObjectsToFree;
16 private int numberOfObjectsStillReferenced;
17 private HashMap<String, AtomicInteger> classesKept;
18 private HashMap<String, AtomicInteger> classesRemoved;
19 private boolean keepTrackOfClassNames;
21 public vtkReferenceInformation(int nbToFree, int nbToKeep, int totalSize) {
22 this.numberOfObjectsToFree = nbToFree;
23 this.numberOfObjectsStillReferenced = nbToKeep;
24 this.keepTrackOfClassNames = false;
27 public vtkReferenceInformation(boolean keepTrackOfClassNames) {
28 this.numberOfObjectsToFree = 0;
29 this.numberOfObjectsStillReferenced = 0;
30 this.keepTrackOfClassNames = keepTrackOfClassNames;
33 public int getTotalNumberOfObjects() {
34 return numberOfObjectsStillReferenced + numberOfObjectsToFree;
37 public int getNumberOfObjectsToFree() {
38 return numberOfObjectsToFree;
41 public int getTotalNumberOfObjectsStillReferenced() {
42 return numberOfObjectsStillReferenced;
45 public void setNumberOfObjectsStillReferenced(int numberOfObjectsStillReferenced) {
46 this.numberOfObjectsStillReferenced = numberOfObjectsStillReferenced;
49 public void setNumberOfObjectsToFree(int numberOfObjectsToFree) {
50 this.numberOfObjectsToFree = numberOfObjectsToFree;
53 public void addFreeObject(String className) {
54 this.numberOfObjectsToFree++;
55 if (keepTrackOfClassNames) {
56 if (classesRemoved == null && className != null) {
57 classesRemoved = new HashMap<String, AtomicInteger>();
59 AtomicInteger counter = classesRemoved.get(className);
60 if (counter == null) {
61 classesRemoved.put(className, new AtomicInteger(1));
63 counter.incrementAndGet();
68 public void addKeptObject(String className) {
69 this.numberOfObjectsStillReferenced++;
70 if (keepTrackOfClassNames && className != null) {
71 if (classesKept == null) {
72 classesKept = new HashMap<String, AtomicInteger>();
74 AtomicInteger counter = classesKept.get(className);
75 if (counter == null) {
76 classesKept.put(className, new AtomicInteger(1));
78 counter.incrementAndGet();
83 public String listKeptReferenceToString() {
84 if (classesKept == null) {
87 final StringBuilder builder = new StringBuilder(500);
88 builder.append("List of classes kept in Java layer:\n");
89 for (Entry<String, AtomicInteger> entry : classesKept.entrySet()) {
90 builder.append(" - ").append(entry.getKey()).append(": ").append(entry.getValue().toString()).append("\n");
92 return builder.toString();
95 public String listRemovedReferenceToString() {
96 if (classesRemoved == null) {
99 final StringBuilder builder = new StringBuilder(500);
100 builder.append("List of classes removed in Java layer:\n");
101 for (Entry<String, AtomicInteger> entry : classesRemoved.entrySet()) {
102 builder.append(" - ").append(entry.getKey()).append(": ").append(entry.getValue().toString()).append("\n");
104 return builder.toString();
107 public String toString() {
108 final StringBuilder builder = new StringBuilder(50);
109 builder.append("VTK Gabage Collection: free(");
110 builder.append(this.numberOfObjectsToFree);
111 builder.append(") - keep(");
112 builder.append(this.numberOfObjectsStillReferenced);
113 builder.append(") - total(");
114 builder.append(this.getTotalNumberOfObjects());
116 return builder.toString();