| Like many other languages, Java provides automatic memory management. In Java, |
| this feature incurs an runtime cost, and can also lead to unpredictable |
| execution pauses. In most cases, this is a reasonable tradeoff, but sometimes |
| the loss of performance or predictability is unacceptable. Examples include |
| pause-sensitive user interface handlers, high query rate server response |
| handlers, or other soft-realtime applications. |
| |
| In these situations, you can annotate a few carefully written methods with |
| @NoAllocation. Methods with this annotation will avoid allocations in most |
| cases, reducing pressure on the garbage collector. Note that allocations may |
| still occur in methods with @NoAllocation if the compiler or runtime system |
| inserts them. |
| |
| To ease the use of exceptions, allocations are allowed if they occur within a |
| throw statement. But if the throw statement contains a nested class with methods |
| annotated with @NoAllocation, those methods will be disallowed from allocating. |