21
21
22
22
namespace Javet {
23
23
namespace Monitor {
24
+ struct HeapSpaceStatisticsContainer {
25
+ jobject allocationSpace;
26
+ jobject completableFuture;
27
+
28
+ HeapSpaceStatisticsContainer (JNIEnv* jniEnv, jobject completableFuture, jobject allocationSpace) noexcept {
29
+ this ->allocationSpace = jniEnv->NewGlobalRef (allocationSpace);
30
+ INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
31
+ this ->completableFuture = jniEnv->NewGlobalRef (completableFuture);
32
+ INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
33
+ }
34
+
35
+ ~HeapSpaceStatisticsContainer () {
36
+ FETCH_JNI_ENV (GlobalJavaVM);
37
+ jniEnv->DeleteGlobalRef (allocationSpace);
38
+ INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
39
+ jniEnv->DeleteGlobalRef (completableFuture);
40
+ INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
41
+ }
42
+ };
43
+
44
+ struct HeapStatisticsContainer {
45
+ jobject completableFuture;
46
+
47
+ HeapStatisticsContainer (JNIEnv* jniEnv, jobject completableFuture) noexcept {
48
+ this ->completableFuture = jniEnv->NewGlobalRef (completableFuture);
49
+ INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
50
+ }
51
+
52
+ ~HeapStatisticsContainer () {
53
+ FETCH_JNI_ENV (GlobalJavaVM);
54
+ jniEnv->DeleteGlobalRef (completableFuture);
55
+ INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
56
+ }
57
+ };
58
+
24
59
void Initialize (JNIEnv* jniEnv) noexcept {
25
60
jclassV8AllocationSpace = FIND_CLASS (jniEnv, " com/caoccao/javet/enums/V8AllocationSpace" );
26
61
jmethodIDV8AllocationSpaceGetIndex = jniEnv->GetMethodID (jclassV8AllocationSpace, " getIndex" , " ()I" );
@@ -48,67 +83,57 @@ namespace Javet {
48
83
v8::Isolate* v8Isolate,
49
84
const jobject jAllocationSpace) noexcept {
50
85
jobject jCompletableFuture = jniEnv->NewObject (jclassCompletableFuture, jmethodIDCompletableFutureConstructor);
51
- auto jobjectRefs = new jobject[]{ jniEnv-> NewGlobalRef ( jCompletableFuture), jniEnv-> NewGlobalRef ( jAllocationSpace) } ;
86
+ auto containerPointer = new HeapSpaceStatisticsContainer (jniEnv, jCompletableFuture, jAllocationSpace);
52
87
INCREASE_COUNTER (Javet::Monitor::CounterType::New);
53
- INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
54
- INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
55
88
if (v8Isolate->IsInUse ()) {
56
- v8Isolate->RequestInterrupt (GetHeapSpaceStatisticsCallback, &jobjectRefs );
89
+ v8Isolate->RequestInterrupt (GetHeapSpaceStatisticsCallback, containerPointer );
57
90
}
58
91
else {
59
92
auto v8Locker = v8::Locker (v8Isolate);
60
- GetHeapSpaceStatisticsCallback (v8Isolate, jobjectRefs );
93
+ GetHeapSpaceStatisticsCallback (v8Isolate, containerPointer );
61
94
}
62
95
return jCompletableFuture;
63
96
}
64
97
65
98
void GetHeapSpaceStatisticsCallback (v8::Isolate* v8Isolate, void * data) noexcept {
66
99
FETCH_JNI_ENV (GlobalJavaVM);
67
100
v8::HeapSpaceStatistics heapSpaceStatistics;
68
- auto jobjectRefs = static_cast <jobject*>(data);
69
- auto jCompletableFuture = jobjectRefs[0 ];
70
- auto jAllocationSpace = jobjectRefs[1 ];
71
- auto index = jniEnv->CallIntMethod (jAllocationSpace, jmethodIDV8AllocationSpaceGetIndex);
101
+ auto containerPointer = static_cast <HeapSpaceStatisticsContainer*>(data);
102
+ auto index = jniEnv->CallIntMethod (containerPointer->allocationSpace , jmethodIDV8AllocationSpaceGetIndex);
72
103
v8Isolate->GetHeapSpaceStatistics (&heapSpaceStatistics, static_cast <size_t >(index ));
73
104
auto jHeapSpaceStatistics = jniEnv->NewObject (jclassV8HeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsConstructor,
74
105
Javet::Converter::ToJavaString (jniEnv, heapSpaceStatistics.space_name ()),
75
106
static_cast <jlong>(heapSpaceStatistics.physical_space_size ()),
76
107
static_cast <jlong>(heapSpaceStatistics.space_available_size ()),
77
108
static_cast <jlong>(heapSpaceStatistics.space_size ()),
78
109
static_cast <jlong>(heapSpaceStatistics.space_used_size ()));
79
- jniEnv->CallObjectMethod (jHeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsSetAllocationSpace, jAllocationSpace );
80
- jniEnv->CallBooleanMethod (jCompletableFuture , jmethodIDCompletableFutureComplete, jHeapSpaceStatistics);
110
+ jniEnv->CallObjectMethod (jHeapSpaceStatistics, jmethodIDV8HeapSpaceStatisticsSetAllocationSpace, containerPointer-> allocationSpace );
111
+ jniEnv->CallBooleanMethod (containerPointer-> completableFuture , jmethodIDCompletableFutureComplete, jHeapSpaceStatistics);
81
112
jniEnv->DeleteLocalRef (jHeapSpaceStatistics);
82
- jniEnv->DeleteGlobalRef (jCompletableFuture);
83
- INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
84
- jniEnv->DeleteGlobalRef (jAllocationSpace);
85
- INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
86
- delete jobjectRefs;
113
+ delete containerPointer;
87
114
INCREASE_COUNTER (Javet::Monitor::CounterType::Delete);
88
115
}
89
116
90
117
jobject GetHeapStatistics (
91
118
JNIEnv* jniEnv,
92
119
v8::Isolate* v8Isolate) noexcept {
93
120
jobject jCompletableFuture = jniEnv->NewObject (jclassCompletableFuture, jmethodIDCompletableFutureConstructor);
94
- auto jobjectRefs = new jobject[]{ jniEnv-> NewGlobalRef ( jCompletableFuture) } ;
121
+ auto containerPointer = new HeapStatisticsContainer (jniEnv, jCompletableFuture);
95
122
INCREASE_COUNTER (Javet::Monitor::CounterType::New);
96
- INCREASE_COUNTER (Javet::Monitor::CounterType::NewGlobalRef);
97
123
if (v8Isolate->IsInUse ()) {
98
- v8Isolate->RequestInterrupt (GetHeapStatisticsCallback, jobjectRefs );
124
+ v8Isolate->RequestInterrupt (GetHeapStatisticsCallback, containerPointer );
99
125
}
100
126
else {
101
127
auto v8Locker = v8::Locker (v8Isolate);
102
- GetHeapStatisticsCallback (v8Isolate, jobjectRefs );
128
+ GetHeapStatisticsCallback (v8Isolate, containerPointer );
103
129
}
104
130
return jCompletableFuture;
105
131
}
106
132
107
133
void GetHeapStatisticsCallback (v8::Isolate* v8Isolate, void * data) noexcept {
108
134
FETCH_JNI_ENV (GlobalJavaVM);
109
135
v8::HeapStatistics heapStatistics;
110
- auto jobjectRefs = static_cast <jobject*>(data);
111
- auto jCompletableFuture = jobjectRefs[0 ];
136
+ auto containerPointer = static_cast <HeapStatisticsContainer*>(data);
112
137
v8Isolate->GetHeapStatistics (&heapStatistics);
113
138
auto jHeapStatistics = jniEnv->NewObject (jclassV8HeapStatistics, jmethodIDV8HeapStatisticsConstructor,
114
139
static_cast <jlong>(heapStatistics.does_zap_garbage ()),
@@ -125,11 +150,9 @@ namespace Javet {
125
150
static_cast <jlong>(heapStatistics.total_physical_size ()),
126
151
static_cast <jlong>(heapStatistics.used_global_handles_size ()),
127
152
static_cast <jlong>(heapStatistics.used_heap_size ()));
128
- jniEnv->CallBooleanMethod (jCompletableFuture , jmethodIDCompletableFutureComplete, jHeapStatistics);
153
+ jniEnv->CallBooleanMethod (containerPointer-> completableFuture , jmethodIDCompletableFutureComplete, jHeapStatistics);
129
154
jniEnv->DeleteLocalRef (jHeapStatistics);
130
- jniEnv->DeleteGlobalRef (jCompletableFuture);
131
- INCREASE_COUNTER (Javet::Monitor::CounterType::DeleteGlobalRef);
132
- delete jobjectRefs;
155
+ delete containerPointer;
133
156
INCREASE_COUNTER (Javet::Monitor::CounterType::Delete);
134
157
}
135
158
0 commit comments