|
Comments
|
Today's Top SOA Links
Feature CFDJ Cover Story — JVM Tuning
The application, machine, and JVM version make a difference
By: John Mason
Aug. 28, 2006 10:00 AM
As ColdFusion programmers or system administrators, there are times when we go through the CF Admin interface to try and optimize the server. A particular section located within the standalone version of the ColdFusion Administrator is simply called Java and JVM. When you reach this section, unless you have a healthy dose of Java experience, you may scratch your head and think, "I don't really know much about this" and skip to something else. But the catch is, this section is the most powerful and important area to look at.
Java and JVM Administrator Section
Some Basic Things to Know About the JVM
Permanent Space
The Heap Space
- Young (New) generation space The specific generation an object falls into is dependent on its age. Any "new born" memory objects that need to be placed into memory are always created in the Eden space first. When Eden fills up, the memory items that are still referenced or "alive" move to Survivor 0 and Eden is cleared out of any old objects that are no longer required by the JVM. This provides room for new incoming objects. When the Survivor 0 space fills up, once again the objects that are still "alive" are moved to Survivor 1 space and Survivor 0 is cleared out. If an object is needed for an extended period of time, it will move into the Tenure space and stay there until it dies. So, all objects in the JVM memory start off in the Eden space and will either die at some point or end up in the Tenure space. Naturally, you will want to see request-scope variables stay in the Eden space, session-scope variables in one of the Survivor spaces, and application-scope variables in the Tenured space.
What Is Garbage Collection? The garbage collector moves things around in the memory heap space and decides whether certain items need to be kept or discarded. If there were no garbage collection, the JVM would run out of memory within a very short period of time. The garbage collector either kills objects or moves them into an older generation space. It also changes the sizes of the spaces depending on your JVM settings and its needs. These are minor garbage collections and are needed for the JVM to run properly. But, as you might expect, over time the Tenure space might fill up. When this happens, the system will run a full garbage collection and try to free up space. This is very intensive, and you don't want to see the system doing this full GC very often. If, for some reason when it runs a full GC and it can't free up the memory, the JVM will crash, taking ColdFusion down with it. This is when you might start noticing java.lang.OutOfMemoryError errors appearing in your exception logs. On a browser, you might see a 500 error saying simply "Java heap space." If you are wondering why the JVM has so many memory spaces, it is because of the garbage collector. Early JVM versions had collectors that had to scan the entire memory space to do a garbage collection. This took up time and resources. By dividing up the space, the collector can run fast minor GCs and do full GCs only when it absolutely needs to. Under this setup, even the full GCs run faster. So it helps boost the performance. When the garbage collector is at work, just about everything within the JVM is put on hold. Naturally, the JVM can't have an application thread writing to a memory space that is being deleted by the collector. So the threads have to wait whenever the collector is in process. This is important because the collector could take a few milliseconds doing a minor GC or it could take a lot longer when doing a full GC to clear up the Tenured space. The speed and number of collectors depends a great deal on processor speed, heap size, and the type of collector you are using. Therefore, you need to see what your garbage collector is doing.
How Do You Determine Your Current Heap Size Usage and Garbage Collection Time? Once you have installed the tools on your machine, you'll be able to pull up a graphical representation of the heap space, permanent space and garbage collector (see Figure 1). This provides the most detail view of your JVM settings. You now have some basic variables to look at. A few other things to take note of are the number and type of processors that are on your server. Also, consider the server's physical memory and its current memory usage. Measure these when the server is under load so you can see the changes in items like memory usage. Microsoft provides a simple and free load tester called "Microsoft Web Application Stress Tool." There is also OpenSTA. Use this to apply enough load to send your CPU usage to 100%. At this point, note the heap size, the amount of the heap being used, the physical memory usage, and the number of full GCs. If the Tenured space is filling up quickly and the garbage collector is doing a full GC every few minutes, you have a problem. You don't want the Tenured space to fill up frequently. If this happens more than once an hour, you will most likely need to adjust your JVM. Reader Feedback: Page 1 of 1
Subscribe to the World's Most Powerful Newsletters
Subscribe to Our Rss Feeds & Get Your SYS-CON News Live!
|
SYS-CON Featured Whitepapers
Most Read This Week |
|||||||||||||||||||||||||||