Module Reference
This reference describes the modules available in Module Management. It is intended for release owners deciding which protections and optimizations belong in a Profile. Test the complete protected artifact rather than judging a module only from a small benchmark or a successful compilation.
Core
Compiler backend
Missing backend values in existing configurations mean JNI. JNI retains multi-target output and its five presets. JVMCI produces a single Windows x86-64 or Linux x86-64 artifact and requires the supported Zulu runtime. The module catalog resolves backend and target availability, built-in behavior and dependencies. Review adjustments when switching backend; each backend keeps its own draft. The JNI-specific dependency descriptions below do not override that catalog. In a JNI build with multiple targets, a platform-specific module may apply to only some targets. The UI lists that scope explicitly; enabling a Windows-only protection does not apply it to the Linux artifact.
Structural Obfuscation
Configure common transformations in the form and inspect advanced options when required. Application is the default scope; whole-artifact is experimental and needs testing against external consumers. Keep rules preserve the declarations that integrations depend on. A fixed 64-bit seed is stored as a decimal string in Web configuration so JavaScript does not round it. Download the private structural mapping from build details and retain it with that exact release. The service chooses its storage path.
NOL configuration and analysis
The NOL dialog groups entry points, reflection, JNI access, serialization, proxies, resources, keep rules and loader domains. Keeping a declaration does not make it an execution entry point. Search for exact classes, members and resources from the JAR, or enter external symbols manually; advanced JSON uses the same configuration. Enum localization has off and proven modes and requires the supported JVMCI/NOL combination shown by the catalog.
Assist configuration opens the free guided Input → Entry points → Resolve issues → Review → Build flow with the complete unsaved compiler draft. It has no sidebar item. Likely main-method candidates require user selection. Issue prompts use structured configuration sections and ask for the actual targets; they do not guess declarations. Prepare multiple edits before rerunning analysis. Review selected NOL changes before returning, or return without declaration changes; saved project defaults remain untouched. Analysis does not activate Object Localization. Its reports describe candidates and proof completeness for the submitted input and declarations, and changing the draft leaves older evidence unverified. See Configure NOL with the analysis assistant for the workflow.
Semantic Mirage and Runtime Profile
Semantic Mirage is an experimental JVMCI protection option. Runtime Profile is an optional JVMCI diagnostic feature; its measurements add runtime work. Both are off by default. Availability and dependencies are resolved for the selected backend and target, and profiling is not a prerequisite for compilation.
Method Selection
Choose Annotated to protect methods marked with @Nativify, or All eligible to extend protection to every eligible method. Annotated selection is the better starting point when a release needs precise control over scope.
| Performance | Compatibility |
|---|---|
| Wider selection can increase build time and native artifact size. It can also change runtime performance in more application paths. | Test the application paths that enter selected methods. Abstract methods are not eligible for protection. |
Target Platforms
Select the operating system and architecture combinations for which Nativify produces native output. JNI Profiles can contain from one to four targets; JVMCI Profiles contain exactly one Windows x86-64 or Linux x86-64 target.
| Performance | Compatibility |
|---|---|
| Every additional target increases build work, output size, and release-test coverage. It has no direct runtime cost on a given target. | The protected artifact must be tested on each selected OS and architecture before release. |
Dynamic Native Registration
Dynamic Native Registration binds protected methods when the application starts. It is also required by modules that use dynamic registration.
| Performance | Compatibility |
|---|---|
| Usually adds only startup work; measure it when startup latency is important. | Required by Virtual Inline Cache and Encrypted Native Payload. Test application startup and every selected target. |
Link-time Optimization
For JNI, Link-time Optimization applies additional optimization after native code for the selected methods is combined. Thin is the scalable default; Full prioritizes the broadest optimization opportunity. JVMCI also supports off, Thin and Full. Its enabled LTO runs within each method recipe’s complete native link unit; it does not merge Java methods across recipe boundaries. Required IR optimization remains active when LTO is off.
| Performance | Compatibility |
|---|---|
| Build time, memory use and runtime behavior depend on the input and selected mode. Measure the resulting artifact for the workloads that matter to your application. | Test the selected backend, target and LTO mode together. JVMCI still requires its supported runtime; enabling LTO does not change that contract. |
Optimization
IR Optimization
IR Optimization improves the native code generated for protected methods. Standard is the default choice; Aggressive applies a broader optimization set.
| Performance | Compatibility |
|---|---|
| Higher modes increase build work and can reduce runtime cost in eligible code. Results vary by workload. | Stable. Required by Object Flow. Validate performance and behavior with the exact selected mode. |
Static Direct Call
Static Direct Call optimizes eligible calls between protected static methods, avoiding unnecessary boundary work when both sides can be linked directly.
| Performance | Compatibility |
|---|---|
| Can reduce call overhead in eligible native-to-native paths. | Stable. Required by the Object Flow options Exact Instance Direct Call and Object Localization. |
Virtual Inline Cache
Virtual Inline Cache accelerates repeatedly observed virtual and interface call targets when they can be cached safely.
| Performance | Compatibility |
|---|---|
| Can improve dispatch-heavy workloads; it may add a small first-use or miss-path cost. | Experimental. Requires Dynamic Native Registration. Test polymorphic application paths, plugins, and framework callbacks. |
Object Flow
Object Flow uses proven information about how objects move through selected code to simplify eligible operations. Its Advanced option exposes further focused optimizations.
| Performance | Compatibility |
|---|---|
| May reduce object-related work in eligible regions, while increasing build analysis time. | Experimental. Requires IR Optimization. Test object-heavy application paths before enabling Advanced options. |
String Flow
String Flow is an Advanced Object Flow option for predictable, non-escaping string-length work in eligible regions.
| Performance | Compatibility |
|---|---|
| Can reduce work in matching string-processing paths; otherwise it has little or no effect. | Experimental. Requires Object Flow and Advanced Object Flow. Test the relevant string-processing workloads. |
Exact Instance Direct Call
Exact Instance Direct Call is an Advanced Object Flow option that directly calls an instance target when its type is proven exact, while preserving normal dispatch elsewhere.
| Performance | Compatibility |
|---|---|
| Can reduce virtual-call overhead at matching call sites. | Experimental. Requires Object Flow, Advanced Object Flow, and Static Direct Call. Test inheritance, proxies, and framework-generated types. |
Object Localization
Object Localization is an Advanced Object Flow option for configurations where object use is precisely understood. Its configuration records application entry points and the dynamic access patterns that must remain available.
| Performance | Compatibility |
|---|---|
| Can reduce work for proven local objects, with extra analysis and build configuration effort. | Experimental. Requires Object Flow, Advanced Object Flow, and Static Direct Call. Configure and test reflection, serialization, JNI access, proxies, resources, keep rules, and custom class-loader domains. |
Stdlib Replacement
Stdlib Replacement substitutes supported standard Java library operations with optimized native equivalents when Nativify can do so safely.
| Performance | Compatibility |
|---|---|
| Can reduce boundary overhead in supported library-heavy paths. It does not affect unsupported operations. | Stable. Test the protected application on the JDK distributions and versions used in production. |
Unsafe Memory Access
Unsafe Memory Access uses sun.misc.Unsafe for eligible direct field access.
| Performance | Compatibility |
|---|---|
| Can reduce field-access overhead in matching code. | Stable. Confirm that the deployed JDK distribution permits the required sun.misc.Unsafe access, and test across your supported JDKs. |
Obfuscation
Obfuscation modules increase the effort needed to understand the protected native code. Their strongest configurations usually increase native code size, build time, runtime work, or all three. Add them after a stable baseline has passed functional and performance testing.
String Encryption
String Encryption protects native string constants so they are not stored as directly readable native text.
| Performance | Compatibility |
|---|---|
| Adds native code and can add work when protected strings are used. | Stable. Verify output that depends on string content, such as localization, protocol values, and generated text. |
Constant Encryption
Constant Encryption encodes native numeric constants, including floating-point bit patterns, to make straightforward inspection less useful. Available runtime operands and supported use sites affect coverage.
It replaces the previous implementation under the same module and feature IDs. Choose Integer only, Floating-point only, or Mixed expression families. Integer only adds no floating-point arithmetic. Floating-point only still needs integer bit packing and conversions. All three modes can protect both integer constants and floating-point bit patterns.
| Setting | Default | Trade-off |
|---|---|---|
| State update coverage | 100% | Samples eligible proven control-flow edges. Lower values reduce state-update work. |
| Constant coverage | 100% | Samples eligible constant sites. Lower values leave more original constants visible. |
| Update state in proven loops | Off | Fully expands small fixed-trip loops before state updates. Unknown loops remain frozen. Expansion increases code size. |
| Maximum proven loop iterations | 8 | Bounds loop expansion when enabled; supports 1–64. |
| Added instruction budget | 0 (automatic) | Limits new IR per method. Automatic uses JNI 8192 or JVMCI 4096. Supports 0–8192. |
Sampling uses the build seed. Proof and instruction-budget limits can reduce actual coverage below the requested percentage. Existing enabled-only configurations use the defaults above. Dashboard presets explicitly increase coverage and budget as you move toward protection. LLVM optimization stays enabled.
| Performance | Compatibility |
|---|---|
| Can increase native code size and arithmetic work around protected constants. | Stable. Test numeric-heavy code and any performance-sensitive loops. |
Bogus Control Flow
Bogus Control Flow adds opaque branches that make the native control-flow graph less direct to follow.
| Performance | Compatibility |
|---|---|
| Increases native code size and can add branch work. | Stable. Use performance tests for branch-heavy code. |
VM Control Flow Flattening
VM Control Flow Flattening represents eligible native control flow through a protected dispatcher. The module name refers to the protected execution form, not to a Java virtual machine.
| Performance | Compatibility |
|---|---|
| Often adds noticeable runtime work and native code size. | Experimental. Enable it only for code where the added protection justifies the measured overhead. |
Instruction Substitution
Instruction Substitution replaces selected native operations with equivalent, less obvious instruction sequences.
| Performance | Compatibility |
|---|---|
| May increase code size and instruction count. | Stable. Measure arithmetic-intensive workloads if they are important to the release. |
Linear MBA
Linear MBA rewrites eligible arithmetic using mixed boolean-arithmetic expressions, making an operation harder to simplify by inspection.
| Performance | Compatibility |
|---|---|
| Can substantially increase instruction count in affected arithmetic. | Experimental. Prefer targeted use after testing numeric correctness and hot paths. |
Split Basic Block
Split Basic Block divides eligible native blocks into smaller blocks to make control flow less compact.
| Performance | Compatibility |
|---|---|
| Increases code size and can add branch overhead. | Stable. Measure branch-heavy code when enabled. |
Call Indirection
Call Indirection replaces direct native calls with indirect calls through a pointer.
| Performance | Compatibility |
|---|---|
| Adds indirection to affected calls and can reduce call-site optimization opportunities. | Stable. Test call-intensive workloads and combinations with other call optimizations. |
Global Variable Indirection
Global Variable Indirection accesses eligible native globals indirectly rather than through a direct reference.
| Performance | Compatibility |
|---|---|
| Adds an extra lookup to affected global accesses. | Stable. Measure code that frequently reads or writes native global state. |
VM Virtualization
VM Virtualization transforms eligible integer regions into a protected execution form designed to be harder to analyze.
| Performance | Compatibility |
|---|---|
| Usually has a high runtime cost in affected regions and can increase native code size. | Experimental. Limited to eligible integer regions; use it only after representative functional and performance testing. |
LLVM Anti-Debugging
LLVM Anti-Debugging adds native debugger checks to protected methods.
| Performance | Compatibility |
|---|---|
| Adds check work to protected code. | Experimental and available only for windows-x86_64. It can conflict with development debuggers, profilers, and automated analysis tools; test the real deployment environment. |
LLVM Anti-Hooking
LLVM Anti-Hooking checks protected native method entry points for signs of inline modification.
| Performance | Compatibility |
|---|---|
| Adds integrity-check work to protected methods. | Experimental and available only for windows-x86_64, linux-x86_64, and macosx-x86_64. Test endpoint security, APM, profiling, and instrumentation products used by your customers. |
Runtime Protection
Runtime-protection modules can decide that an environment is not acceptable for the protected application. They are intentionally incompatible with some development, automation, virtualization, or analysis environments, so staging tests must closely match production.
Runtime Anti-Analysis
Runtime Anti-Analysis checks for suspicious Windows environments. Balanced uses a lower-sensitivity policy; Strict applies more sensitive checks.
| Performance | Compatibility |
|---|---|
| Adds startup and runtime checks. Strict can reject more environments. | Experimental and intended for Windows. Test physical devices, virtual desktop infrastructure, CI, support tooling, and endpoint protection before release. |
VM Rejection
VM Rejection prevents the protected application from running in detected Windows virtual-machine environments.
| Performance | Compatibility |
|---|---|
| Adds environment checks, usually most visible at startup. | Experimental and available only for windows-x86_64. Do not enable it for releases that must run in virtual machines, hosted desktops, common test farms, or developer VMs. |
Encrypted Native Payload
Encrypted Native Payload protects all selected Windows x86-64, Linux x86-64, and Linux ARM64 native libraries at rest in one authenticated graph. Each target uses its own verified bootstrap. Linux streams decryption into anonymous ELF segments, without retaining a complete plaintext main file or memfd. Temporary AES material and decompression workspaces are released before image code executes. The unmodified recovered main library rejects initialization without a fresh signature from its build-specific loader; this does not prevent runtime memory inspection, native-code patching, or handshake replication after reversing the bootstrap.
| Performance | Compatibility |
|---|---|
| Adds native payload processing during application startup and increases artifact size. | Experimental; requires Dynamic Native Registration. Windows uses a memory-mapped PE loader with static zlib and system BCrypt. Linux uses an anonymous ELF mapper with W^X, RELRO, unwind registration, and compiler-generated emulated TLS. Build with matching headers and target-compatible PIC libcrypto.a/libz.a; no dynamic crypto/zlib fallback is used. Runtime still needs system C/thread/dynamic loader libraries and shared libgcc_s. Private shared dependencies need their own search paths. Rebuild releases to update embedded dependencies. Test the exact target environments you support. |