@@ -2148,44 +2148,51 @@ void os::Linux::print_system_memory_info(outputStream* st) {
2148
2148
" /sys/kernel/mm/transparent_hugepage/defrag" , st);
2149
2149
}
2150
2150
2151
- void os::Linux::print_process_memory_info (outputStream* st) {
2152
-
2153
- st->print_cr (" Process Memory:" );
2154
-
2155
- // Print virtual and resident set size; peak values; swap; and for
2156
- // rss its components if the kernel is recent enough.
2157
- ssize_t vmsize = -1 , vmpeak = -1 , vmswap = -1 ,
2158
- vmrss = -1 , vmhwm = -1 , rssanon = -1 , rssfile = -1 , rssshmem = -1 ;
2159
- const int num_values = 8 ;
2160
- int num_found = 0 ;
2151
+ bool os::Linux::query_process_memory_info (os::Linux::meminfo_t * info) {
2161
2152
FILE* f = ::fopen (" /proc/self/status" , " r" );
2153
+ const int num_values = sizeof (os::Linux::meminfo_t ) / sizeof (size_t );
2154
+ int num_found = 0 ;
2162
2155
char buf[256 ];
2156
+ info->vmsize = info->vmpeak = info->vmrss = info->vmhwm = info->vmswap =
2157
+ info->rssanon = info->rssfile = info->rssshmem = -1 ;
2163
2158
if (f != NULL ) {
2164
2159
while (::fgets (buf, sizeof (buf), f) != NULL && num_found < num_values) {
2165
- if ( (vmsize == -1 && sscanf (buf, " VmSize: " SSIZE_FORMAT " kB" , &vmsize) == 1 ) ||
2166
- (vmpeak == -1 && sscanf (buf, " VmPeak: " SSIZE_FORMAT " kB" , &vmpeak) == 1 ) ||
2167
- (vmswap == -1 && sscanf (buf, " VmSwap: " SSIZE_FORMAT " kB" , &vmswap) == 1 ) ||
2168
- (vmhwm == -1 && sscanf (buf, " VmHWM: " SSIZE_FORMAT " kB" , &vmhwm) == 1 ) ||
2169
- (vmrss == -1 && sscanf (buf, " VmRSS: " SSIZE_FORMAT " kB" , &vmrss) == 1 ) ||
2170
- (rssanon == -1 && sscanf (buf, " RssAnon: " SSIZE_FORMAT " kB" , &rssanon) == 1 ) ||
2171
- (rssfile == -1 && sscanf (buf, " RssFile: " SSIZE_FORMAT " kB" , &rssfile) == 1 ) ||
2172
- (rssshmem == -1 && sscanf (buf, " RssShmem: " SSIZE_FORMAT " kB" , &rssshmem) == 1 )
2160
+ if ( (info-> vmsize == -1 && sscanf (buf, " VmSize: " SSIZE_FORMAT " kB" , &info-> vmsize ) == 1 ) ||
2161
+ (info-> vmpeak == -1 && sscanf (buf, " VmPeak: " SSIZE_FORMAT " kB" , &info-> vmpeak ) == 1 ) ||
2162
+ (info-> vmswap == -1 && sscanf (buf, " VmSwap: " SSIZE_FORMAT " kB" , &info-> vmswap ) == 1 ) ||
2163
+ (info-> vmhwm == -1 && sscanf (buf, " VmHWM: " SSIZE_FORMAT " kB" , &info-> vmhwm ) == 1 ) ||
2164
+ (info-> vmrss == -1 && sscanf (buf, " VmRSS: " SSIZE_FORMAT " kB" , &info-> vmrss ) == 1 ) ||
2165
+ (info-> rssanon == -1 && sscanf (buf, " RssAnon: " SSIZE_FORMAT " kB" , &info-> rssanon ) == 1 ) || // Needs Linux 4.5
2166
+ (info-> rssfile == -1 && sscanf (buf, " RssFile: " SSIZE_FORMAT " kB" , &info-> rssfile ) == 1 ) || // Needs Linux 4.5
2167
+ (info-> rssshmem == -1 && sscanf (buf, " RssShmem: " SSIZE_FORMAT " kB" , &info-> rssshmem ) == 1 ) // Needs Linux 4.5
2173
2168
)
2174
2169
{
2175
2170
num_found ++;
2176
2171
}
2177
2172
}
2178
2173
fclose (f);
2174
+ return true ;
2175
+ }
2176
+ return false ;
2177
+ }
2178
+
2179
+ void os::Linux::print_process_memory_info (outputStream* st) {
2179
2180
2180
- st->print_cr (" Virtual Size: " SSIZE_FORMAT " K (peak: " SSIZE_FORMAT " K)" , vmsize, vmpeak);
2181
- st->print (" Resident Set Size: " SSIZE_FORMAT " K (peak: " SSIZE_FORMAT " K)" , vmrss, vmhwm);
2182
- if (rssanon != -1 ) { // requires kernel >= 4.5
2181
+ st->print_cr (" Process Memory:" );
2182
+
2183
+ // Print virtual and resident set size; peak values; swap; and for
2184
+ // rss its components if the kernel is recent enough.
2185
+ meminfo_t info;
2186
+ if (query_process_memory_info (&info)) {
2187
+ st->print_cr (" Virtual Size: " SSIZE_FORMAT " K (peak: " SSIZE_FORMAT " K)" , info.vmsize , info.vmpeak );
2188
+ st->print (" Resident Set Size: " SSIZE_FORMAT " K (peak: " SSIZE_FORMAT " K)" , info.vmrss , info.vmhwm );
2189
+ if (info.rssanon != -1 ) { // requires kernel >= 4.5
2183
2190
st->print (" (anon: " SSIZE_FORMAT " K, file: " SSIZE_FORMAT " K, shmem: " SSIZE_FORMAT " K)" ,
2184
- rssanon, rssfile, rssshmem);
2191
+ info. rssanon , info. rssfile , info. rssshmem );
2185
2192
}
2186
2193
st->cr ();
2187
- if (vmswap != -1 ) { // requires kernel >= 2.6.34
2188
- st->print_cr (" Swapped out: " SSIZE_FORMAT " K" , vmswap);
2194
+ if (info. vmswap != -1 ) { // requires kernel >= 2.6.34
2195
+ st->print_cr (" Swapped out: " SSIZE_FORMAT " K" , info. vmswap );
2189
2196
}
2190
2197
} else {
2191
2198
st->print_cr (" Could not open /proc/self/status to get process memory related information" );
@@ -2206,7 +2213,7 @@ void os::Linux::print_process_memory_info(outputStream* st) {
2206
2213
struct glibc_mallinfo mi = _mallinfo ();
2207
2214
total_allocated = (size_t )(unsigned )mi.uordblks ;
2208
2215
// Since mallinfo members are int, glibc values may have wrapped. Warn about this.
2209
- might_have_wrapped = (vmrss * K) > UINT_MAX && (vmrss * K) > (total_allocated + UINT_MAX);
2216
+ might_have_wrapped = (info. vmrss * K) > UINT_MAX && (info. vmrss * K) > (total_allocated + UINT_MAX);
2210
2217
}
2211
2218
if (_mallinfo2 != NULL || _mallinfo != NULL ) {
2212
2219
st->print_cr (" C-Heap outstanding allocations: " SIZE_FORMAT " K%s" ,
0 commit comments