Following are the questions answered to one of the mailing lists. Here it is shared.....
Usually Performance issues with JVM's are related either to,
1. JDK Bugs
2. JVM thread deadlocks and memory leaks 3. Application request taking too long to process ex. long running query, poor sql, db issues or java coding 4. Poor performing Garbage collection
5. Incorrect JVM startup settings
The amount of memory that should be allocated to each JVM depends on the number of JVM's, the number of users on the system, the amount of physical memory on the middle tiers, the habits of the users and the version of the JDK used by the system. THe version of JDK being used makes a large difference to how the memory and the number of JVM's should be sized. JDK 1.3 performs better with more JVM's and less heap while JDK 1.4/1.5 performs better when there are less JVM's and more heap. Thumb rule is to have 1JVM per 2 cpu's with increased heap parameter for better performance. As a minimum 1JVM per CPU can be used.
So now you know why the crash has gone after the new changes on JVM. JVM always uses native threads to execute requests and parallel garbage collection will spawn as many threads as CPU's. GC is not parallel that is GC cannot be parallel for a single JVM but parallelism happens only when there are more than 1 JVM, so having 1JVM per 2 CPU's helps to a larger extent. This answers your question on parallel GC
(Q3). Some tips for tuning.
1. Make sure that there are not FULL GC happening very often. 2. Use OAM to track memory usage and GC 3. Use IAS_ORACLE_HOME/Apache/Jserv/logs/jvm/OACoreGroup.x.stdout to determine how often GC is occuring. Here x in the file name is the JVM number starts with 0. 4. Use debug JVM options to obtain extra information regarding Heap Performance
To know what objects are using up memory as well as how much memory is freed after the first call to the garbage collection, use Java Profile on top of the JVM. Example OptimizeIt, HPJMeter, JProbe, JVMStat, Visualgc. This answers your question on how to find the module using high JVM(Q1). Following are few links for the tools mentioned above:
http://www.quest.com/jprobe/ http://developers.sun.com/dev/coolstuff/jvmstat http://java.sun.com/performance/jvmstat/visualgc.html Once the object/code is identified, if it is a standard Oracle Apps code then you need to log a bug with Oracle Development else if its a custom object then fire the customer for it. This answers your question2. JDK 1.5 gives over 40% higher performance over JDK 1.4. So higher the version of JDK better is the performance. Ask your customer to upgrade the JDK. Hope my few cents help.
Usually Performance issues with JVM's are related either to,
1. JDK Bugs
2. JVM thread deadlocks and memory leaks 3. Application request taking too long to process ex. long running query, poor sql, db issues or java coding 4. Poor performing Garbage collection
5. Incorrect JVM startup settings
The amount of memory that should be allocated to each JVM depends on the number of JVM's, the number of users on the system, the amount of physical memory on the middle tiers, the habits of the users and the version of the JDK used by the system. THe version of JDK being used makes a large difference to how the memory and the number of JVM's should be sized. JDK 1.3 performs better with more JVM's and less heap while JDK 1.4/1.5 performs better when there are less JVM's and more heap. Thumb rule is to have 1JVM per 2 cpu's with increased heap parameter for better performance. As a minimum 1JVM per CPU can be used.
So now you know why the crash has gone after the new changes on JVM. JVM always uses native threads to execute requests and parallel garbage collection will spawn as many threads as CPU's. GC is not parallel that is GC cannot be parallel for a single JVM but parallelism happens only when there are more than 1 JVM, so having 1JVM per 2 CPU's helps to a larger extent. This answers your question on parallel GC
(Q3). Some tips for tuning.
1. Make sure that there are not FULL GC happening very often. 2. Use OAM to track memory usage and GC 3. Use IAS_ORACLE_HOME/Apache/Jserv/logs/jvm/OACoreGroup.x.stdout to determine how often GC is occuring. Here x in the file name is the JVM number starts with 0. 4. Use debug JVM options to obtain extra information regarding Heap Performance
To know what objects are using up memory as well as how much memory is freed after the first call to the garbage collection, use Java Profile on top of the JVM. Example OptimizeIt, HPJMeter, JProbe, JVMStat, Visualgc. This answers your question on how to find the module using high JVM(Q1). Following are few links for the tools mentioned above:
http://www.quest.com/jprobe/ http://developers.sun.com/dev/coolstuff/jvmstat http://java.sun.com/performance/jvmstat/visualgc.html Once the object/code is identified, if it is a standard Oracle Apps code then you need to log a bug with Oracle Development else if its a custom object then fire the customer for it. This answers your question2. JDK 1.5 gives over 40% higher performance over JDK 1.4. So higher the version of JDK better is the performance. Ask your customer to upgrade the JDK. Hope my few cents help.
Comments