1. Getting started
- 1.1. Installing Javonet
- 1.2. Activating Javonet
- 1.3. Adding References to .NET Libraries
- 1.4. XML Configuration File
- 1.5. Using the Javonet Fluent Interface
- 1.7. Introduction to Using .NET Back-end and UI Components in Java
2. Calling methods
- 2.1. Invoking Static Methods
- 2.2. Creating Instance and Calling Instance Methods
- 2.3. Calling Generic Methods
3. Working with .NET Objects
- 3.1. Creating Instance Of Generic Object
- 3.2. Extending the .NET Class in Java and Wrapping .NET Methods
4. Fields and Properties
- 4.1. Get/Set Values for Static Fields and Properties
- 4.2. Get/Set Values for Instance Fields and Properties
5. Methods Arguments
- 5.1. Passing Reference-Type Arguments
- 5.2. Passing Arguments by Reference with “ref” and “out” Keywords
- 5.3. Passing typeof(Type) as Method Argument
- 5.4. Calling Overloaded Method Passing Null Argument
6. Nested Types
7. Enums
8. Arrays and Collections
- 8.1. Arrays: Using Value-Type and Reference-Type Arrays
- 8.2. Working with .NET arrays and collections from Java with Javonet
9. Embeding UI controls
10. Referencing libraries
11. Off-line activation
12. Events and Delegates
13. Disposing and Garabage Collection
14. .NET Configuration Files (AppConfig, WebConfig)
15. Exceptions, Debugging and Testing
- 15.. Handling Activation Issues
- 15.1. Handling .NET Exceptions
- 15.2. How to debug .NET code called from Java
- 15.3. Debugging Javonet Enabled Application
16. Strongly-Typed Wrappers
17. Advanced Activation and Licensing
- 17.1. Runtime vs. Offline vs. Compile Time Activation
- 17.2. Project Activation Tool
- 17.6. Delegating Activation Server
18 Other usage scenarios
Batching GC with DelayGcContext
There could be a scenario where huge amount of short living instances of .NET objects is created on Java side. Huge amount is estimated above 500 000 objects per minute. It could be when .NET side triggers event subscribed on Java side with many reference-type arguments (NObjects) or when multiple objects are being created for executing business logic calculation in big loops. In each of these cases when memory utilization is increased Java garbage collector will quickly start collecting NObject instances. Javonet forwards such calls to .NET side. When there are more than 500 000 collections per minute the overall application performance might be affected by additional GC call for each of the NObject instances.
In such cases the new DelayGcContext class (introduced in Javonet 1.4) could be applied. The best way to determine if DelayGcContext is required is by performing performance tests with suspicious piece of code. DelayGcContext class allows to indicate the beginning and the end of the code for which the garbage collection calls should be batched. The GC buffer for these objects will be flushed to .NET side every time the buffer size exceeds 100 000 objects pending in the queue or when 30 seconds pass.
The beginning of delayed garbage collection section should be indicated by calling static “Begin” method on DelayGcContext class and terminated by calling “End” method as presented on the snippet below:
DelayGcContext.Begin(); for (int i=0; i<5000000;i++) { NObject objA = Javonet.New("SampleType",i); NObject objB = objA.get("B"); processItem(objB); (... some other operations ...) NObject objC = objB.getRef("subProp").getRef("subProp").invoke("GetC"); //in this block objA, objB, and objC instance if not referenced in other parts of code //will be subjected for garbage collection after each iteration of the loop } DelayGcContext.End();
More about DelayGcContext you can read in our docs section for DelayGcContext class.