IBM BS029ML Self Help Guide - Page 159

Tuning advice for the SUN Microsystems Java Virtual Machine (JVM)

Page 159 highlights

%CPU. More GC threads (-XgcthreadsN) will provide more mark stacks (and queues), which means less likelihood of a mark stack overflow. A Java heapdump analysis may also help. Just-In-Time Compiler (JIT or JITC) By default, the IBM JVM ships with the JIT (Just-In-Time) compiler enabled. JIT effectively offers a performance improvement by replacing some of the commonly used Java methods and objects with highly optimized C and Assembler routines. This, by necessity, requires an amount of native memory to accommodate the compilation and resulting code set. It is also worth noting that with JIT enabled, contending methods are not immediately compiled. Instead, such methods are only JIT compiled after they have been invoked after a certain number of times or threshold. This may well present itself as a delayed growth in native memory and could be misinterpreted as a native memory leak (also a performance issue). It is possible to force JIT to compile methods up front without delay. However, this approach is not normally recommended and thus is not documented here. Native memory associated with the IBM JVM It is important to remember that when dealing with a JVM that there is an amount of native memory associated with the process. The types of objects allocated in the native heap or permitted "data area" for the IBM JVM are as follows: Just-In-Time (JIT) Compiled code Java Native Interface (JNI™) code Native Thread Stacks Inflators / Deflators GZipOutputStreams Class Loaded data IBM JVM CPU utilization If a system is observed to consume a very high % of CPU for a process associated with the WebSphere JVM, then this could be indicative of spending too much time performing Java garbage collection (GC). In such cases, the recommended action is to use either Tivoli Performance Viewer or a verbose garbage collection trace to identify the characteristics of the Java heap. If you deduce that it is indeed the Java garbage collection (GC) cycle that is stealing CPU, it does not necessarily indicate a JVM performance or defect issue. More commonly, it may indicate an object management issue in the application or WebSphere. Remember that if a reference to an object is not released, then GC will be unable to free that memory back to the heap; vectors and arrays are particularly prone to this problem if coded incorrectly (session beans and self-grown caches). 5.2.3 Tuning advice for the SUN Microsystems Java Virtual Machine (JVM) There are major differences between the IBM and SUN Microsystems JVM implementations. It is therefore important to recognize that the SUN JVM includes a generational heap, which splits objects between a Young (Eden) generation (objects are created here) and an Older generation (objects are promoted to the older generation). Each generation is garbage collected (GC) independently and uses a different collection strategy. There also exists a Permanent generation that typically holds class loaded data. Chapter 5. WebSphere Portal runtime and services 145

  • 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
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242

Chapter 5. WebSphere Portal runtime and services
145
%CPU. More GC threads (-Xgcthreads
N
) will provide more mark stacks (and queues), which
means less likelihood of a mark stack overflow. A Java heapdump analysis may also help.
Just-In-Time Compiler (JIT or JITC)
By default, the IBM JVM ships with the JIT (Just-In-Time) compiler enabled. JIT effectively
offers a performance improvement by replacing some of the commonly used Java methods
and objects with highly optimized C and Assembler routines. This, by necessity, requires an
amount of native memory to accommodate the compilation and resulting code set.
It is also worth noting that with JIT enabled, contending methods are not immediately
compiled. Instead, such methods are only JIT compiled after they have been invoked after a
certain number of times or threshold. This may well present itself as a delayed growth in
native memory and could be misinterpreted as a native memory leak (also a performance
issue).
It is possible to force JIT to compile methods up front without delay. However, this approach is
not normally recommended and thus is not documented here.
Native memory associated with the IBM JVM
It is important to remember that when dealing with a JVM that there is an amount of native
memory associated with the process. The types of objects allocated in the native heap or
permitted “data area” for the IBM JVM are as follows:
±
Just-In-Time (JIT) Compiled code
±
Java Native Interface (JNI™) code
±
Native Thread Stacks
±
Inflators / Deflators
±
GZipOutputStreams
±
Class Loaded data
IBM JVM CPU utilization
If a system is observed to consume a very high % of CPU for a process associated with the
WebSphere JVM, then this could be indicative of spending too much time performing Java
garbage collection (GC). In such cases, the recommended action is to use either Tivoli
Performance Viewer or a verbose garbage collection trace to identify the characteristics of the
Java heap.
If you deduce that it is indeed the Java garbage collection (GC) cycle that is stealing CPU, it
does not necessarily indicate a JVM performance or defect issue. More commonly, it may
indicate an object management issue in the application or WebSphere. Remember that if a
reference to an object is not released, then GC will be unable to free that memory back to the
heap; vectors and arrays are particularly prone to this problem if coded incorrectly (session
beans and self-grown caches).
5.2.3
Tuning advice for the SUN Microsystems Java Virtual Machine (JVM)
There are major differences between the IBM and SUN Microsystems JVM implementations.
It is therefore important to recognize that the SUN JVM includes a generational heap, which
splits objects between a Young (Eden) generation (objects are created here) and an Older
generation (objects are promoted to the older generation). Each generation is garbage
collected (GC) independently and uses a different collection strategy. There also exists a
Permanent generation that typically holds class loaded data.