| This document describes system properties that are used for internal |
| debugging and instrumentation purposes, along with the system loggers, |
| which are used for the same thing. |
| |
| This document is intended as a developer resource, and it is not |
| needed as Nashorn documentation for normal usage. Flags and system |
| properties described herein are subject to change without notice. |
| |
| ===================================== |
| 1. System properties used internally |
| ===================================== |
| |
| This documentation of the system property flags assume that the |
| default value of the flag is false, unless otherwise specified. |
| |
| SYSTEM PROPERTY: -Dnashorn.args=<string> |
| |
| This property takes as its value a space separated list of Nashorn |
| command line options that should be passed to Nashorn. This might be |
| useful in environments where it is hard to tell how a nashorn.jar is |
| launched. |
| |
| Example: |
| |
| > java -Dnashorn.args="--lazy-complation --log=compiler" large-java-app-with-nashorn.jar |
| > ant -Dnashorn.args="--log=codegen" antjob |
| |
| SYSTEM PROPERTY: -Dnashorn.args.prepend=<string> |
| |
| This property behaves like nashorn.args, but adds the given arguments |
| before the existing ones instead of after them. Later arguments will |
| overwrite earlier ones, so this is useful for setting default arguments |
| that can be overwritten. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.unstable.relink.threshold=x |
| |
| This property controls how many call site misses are allowed before a |
| callsite is relinked with "apply" semantics to never change again. |
| In the case of megamorphic callsites, this is necessary, or the |
| program would spend all its time swapping out callsite targets. Dynalink |
| has a default value (currently 8 relinks) for this property if it |
| is not explicitly set. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.compiler.splitter.threshold=x |
| |
| This will change the node weight that requires a subgraph of the IR to |
| be split into several classes in order not to run out of bytecode space. |
| The default value is 0x8000 (32768). |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.serialize.compression=<x> |
| |
| This property sets the compression level used when deflating serialized |
| AST structures of anonymous split functions. Valid values range from 0 to 9, |
| the default value is 4. Higher values will reduce memory size of serialized |
| AST but increase CPU usage required for compression. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.codegen.debug.trace=<x> |
| |
| See the description of the codegen logger below. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.fields.objects, -Dnashorn.fields.dual |
| |
| When the nashorn.fields.objects property is true, Nashorn will always |
| use object fields for AccessorProperties, requiring boxing for all |
| primitive property values. When nashorn.fields.dual is set, Nashorn |
| will always use dual long/object fields, which allows primitives to be |
| stored without boxing. When neither system property is set, Nashorn |
| chooses a setting depending on the optimistic types setting (dual |
| fields when optimistic types are enabled, object-only fields otherwise). |
| |
| With dual fields, Nashorn uses long fields to store primitive values. |
| Ints are represented as the 32 low bits of the long fields. Doubles |
| are represented as the doubleToLongBits of their value. This way a |
| single field can be used for all primitive types. Packing and |
| unpacking doubles to their bit representation is intrinsified by |
| the JVM and extremely fast. |
| |
| In the future, this might complement or be replaced by experimental |
| feature sun.misc.TaggedArray, which has been discussed on the mlvm |
| mailing list. TaggedArrays are basically a way to share data space |
| between primitives and references, and have the GC understand this. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.compiler.symbol.trace=[<x>[,*]], |
| -Dnashorn.compiler.symbol.stacktrace=[<x>[,*]] |
| |
| When this property is set, creation and manipulation of any symbol |
| named "x" will show information about when the compiler changes its |
| type assumption, bytecode local variable slot assignment and other |
| data. This is useful if, for example, a symbol shows up as an Object, |
| when you believe it should be a primitive. Usually there is an |
| explanation for this, for example that it exists in the global scope |
| and type analysis has to be more conservative. |
| |
| Several symbols names to watch can be specified by comma separation. |
| |
| If no variable name is specified (and no equals sign), all symbols |
| will be watched |
| |
| By using "stacktrace" instead of or together with "trace", stack |
| traces will be displayed upon symbol changes according to the same |
| semantics. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.lexer.xmlliterals |
| |
| If this property it set, it means that the Lexer should attempt to |
| parse XML literals, which would otherwise generate syntax |
| errors. Warning: there are currently no unit tests for this |
| functionality. |
| |
| XML literals, when this is enabled, end up as standard LiteralNodes in |
| the IR. |
| |
| |
| SYSTEM_PROPERTY: -Dnashorn.debug |
| |
| If this property is set to true, Nashorn runs in Debug mode. Debug |
| mode is slightly slower, as for example statistics counters are enabled |
| during the run. Debug mode makes available a NativeDebug instance |
| called "Debug" in the global space that can be used to print property |
| maps and layout for script objects, as well as a "dumpCounters" method |
| that will print the current values of the previously mentioned stats |
| counters. |
| |
| These functions currently exists for Debug: |
| |
| "map" - print(Debug.map(x)) will dump the PropertyMap for object x to |
| stdout (currently there also exist functions called "embedX", where X |
| is a value from 0 to 3, that will dump the contents of the embed pool |
| for the first spill properties in any script object and "spill", that |
| will dump the contents of the growing spill pool of spill properties |
| in any script object. This is of course subject to change without |
| notice, should we change the script object layout. |
| |
| "methodHandle" - this method returns the method handle that is used |
| for invoking a particular script function. |
| |
| "identical" - this method compares two script objects for reference |
| equality. It is a == Java comparison |
| |
| "equals" - Returns true if two objects are either referentially |
| identical or equal as defined by java.lang.Object.equals. |
| |
| "dumpCounters" - will dump the debug counters' current values to |
| stdout. |
| |
| Currently we count number of ScriptObjects in the system, number of |
| Scope objects in the system, number of ScriptObject listeners added, |
| removed and dead (without references). |
| |
| We also count number of ScriptFunctions, ScriptFunction invocations |
| and ScriptFunction allocations. |
| |
| Furthermore we count PropertyMap statistics: how many property maps |
| exist, how many times were property maps cloned, how many times did |
| the property map history cache hit, prevent new allocations, how many |
| prototype invalidations were done, how many time the property map |
| proto cache hit. |
| |
| Finally we count callsite misses on a per callsite bases, which occur |
| when a callsite has to be relinked, due to a previous assumption of |
| object layout being invalidated. |
| |
| "getContext" - return the current Nashorn context. |
| |
| "equalWithoutType" - Returns true if if the two objects are both |
| property maps, and they have identical properties in the same order, |
| but allows the properties to differ in their types. |
| |
| "diffPropertyMaps" Returns a diagnostic string representing the difference |
| of two property maps. |
| |
| "getClass" - Returns the Java class of an object, or undefined if null. |
| |
| "toJavaString" - Returns the Java toString representation of an object. |
| |
| "toIdentString" - Returns a string representation of an object consisting |
| of its java class name and hash code. |
| |
| "getListenerCount" - Return the number of property listeners for a |
| script object. |
| |
| "getEventQueueCapacity" - Get the capacity of the event queue. |
| |
| "setEventQueueCapacity" - Set the event queue capacity. |
| |
| "addRuntimeEvent" - Add a runtime event to the runtime event queue. |
| The queue has a fixed size (see -Dnashorn.runtime.event.queue.size) |
| and the oldest entry will be thrown out of the queue is about to overflow. |
| |
| "expandEventQueueCapacity" - Expands the event queue capacity, |
| or truncates if capacity is lower than current capacity. Then only |
| the newest entries are kept. |
| |
| "clearRuntimeEvents" - Clear the runtime event queue. |
| |
| "removeRuntimeEvent" - Remove a specific runtime event from the event queue. |
| |
| "getRuntimeEvents" - Return all runtime events in the queue as an array. |
| |
| "getLastRuntimeEvent" - Return the last runtime event in the queue. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.methodhandles.debug.stacktrace |
| |
| This enhances methodhandles logging (see below) to also dump the |
| stack trace for every instrumented method handle operation. |
| Warning: This is enormously verbose, but provides a pretty |
| decent "grep:able" picture of where the calls are coming from. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.cce |
| |
| Setting this system property causes the Nashorn linker to rely on |
| ClassCastExceptions for triggering a callsite relink. If not set, the linker |
| will add an explicit instanceof guard. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.spill.threshold=<x> |
| |
| This property sets the number of fields in an object from which to use |
| generic array based spill storage instead of Java fields. The default value |
| is 256. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.tcs.miss.samplePercent=<x> |
| |
| When running with the trace callsite option (-tcs), Nashorn will count |
| and instrument any callsite misses that require relinking. As the |
| number of relinks is large and usually produces a lot of output, this |
| system property can be used to constrain the percentage of misses that |
| should be logged. Typically this is set to 1 or 5 (percent). 1% is the |
| default value. |
| |
| SYSTEM PROPERTY: -Dnashorn.persistent.code.cache |
| |
| This property can be used to set the directory where Nashorn stores |
| serialized script classes generated with the -pcc/--persistent-code-cache |
| option. The default directory name is "nashorn_code_cache". |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.typeInfo.maxFiles |
| |
| Maximum number of files to store in the type info cache. The type info cache |
| is used to cache type data of JavaScript functions when running with |
| optimistic types (-ot/--optimistic-types). There is one file per JavaScript |
| function in the cache. |
| |
| The default value is 0 which means the feature is disabled. Setting this |
| to something like 20000 is probably good enough for most applications and |
| will usually cap the cache directory to about 80MB presuming a 4kB |
| filesystem allocation unit. Set this to "unlimited" to run without limit. |
| |
| If the value is not 0 or "unlimited", Nashorn will spawn a cleanup thread |
| that makes sure the number of files in the cache does not exceed the given |
| value by deleting the least recently modified files. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.typeInfo.cacheDir |
| |
| This property can be used to set the directory where Nashorn stores the |
| type info cache when -Dnashorn.typeInfo.maxFiles is set to a nonzero |
| value. The default location is platform specific. On Windows, it is |
| "${java.io.tmpdir}\com.oracle.java.NashornTypeInfo". On Linux and |
| Solaris it is "~/.cache/com.oracle.java.NashornTypeInfo". On Mac OS X, |
| it is "~/Library/Caches/com.oracle.java.NashornTypeInfo". |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.typeInfo.cleanupDelaySeconds=<value> |
| |
| This sets the delay between cleanups of the typeInfo cache, in seconds. |
| The default delay is 20 seconds. |
| |
| |
| SYSTEM PROPERTY: -Dnashorn.profilefile=<filename> |
| |
| When running with the profile callsite options (-pcs), Nashorn will |
| dump profiling data for all callsites to stderr as a shutdown hook. To |
| instead redirect this to a file, specify the path to the file using |
| this system property. |
| |
| |
| SYSTEM_PROPERTY: -Dnashorn.regexp.impl=[jdk|joni] |
| |
| This property defines the regular expression engine to be used by |
| Nashorn. Set this flag to "jdk" to get an implementation based on the |
| JDK's java.util.regex package. Set this property to "joni" to install |
| an implementation based on Joni, the regular expression engine used by |
| the JRuby project. The default value for this flag is "joni" |
| |
| SYSTEM PROPERTY: -Dnashorn.runtime.event.queue.size=<value> |
| |
| Nashorn provides a fixed sized runtime event queue for debugging purposes. |
| See -Dnashorn.debug for methods to access the event queue. |
| The default value is 1024. |
| |
| =============== |
| 2. The loggers. |
| =============== |
| |
| It is very simple to create your own logger. Use the DebugLogger class |
| and give the subsystem name as a constructor argument. |
| |
| The Nashorn loggers can be used to print per-module or per-subsystem |
| debug information with different levels of verbosity. The loggers for |
| a given subsystem are available are enabled by using |
| |
| --log=<systemname>[:<level>] |
| |
| on the command line. |
| |
| Here <systemname> identifies the name of the subsystem to be logged |
| and the optional colon and level argument is a standard |
| java.util.logging.Level name (severe, warning, info, config, fine, |
| finer, finest). If the level is left out for a particular subsystem, |
| it defaults to "info". Any log message logged as the level or a level |
| that is more important will be output to stderr by the logger. |
| |
| Several loggers can be enabled by a single command line option, by |
| putting a comma after each subsystem/level tuple (or each subsystem if |
| level is unspecified). The --log option can also be given multiple |
| times on the same command line, with the same effect. |
| |
| For example: --log=codegen,fields:finest is equivalent to |
| --log=codegen:info --log=fields:finest |
| |
| The following is an incomplete list of subsystems that currently |
| support logging. Look for classes implementing |
| jdk.nashorn.internal.runtime.logging.Loggable for more loggers. |
| |
| |
| * compiler |
| |
| The compiler is in charge of turning source code and function nodes |
| into byte code, and installs the classes into a class loader |
| controlled from the Context. Log messages are, for example, about |
| things like new compile units being allocated. The compiler has global |
| settings that all the tiers of codegen (e.g. Lower and CodeGenerator) |
| use.s |
| |
| |
| * recompile |
| |
| This logger shows information about recompilation of scripts and |
| functions at runtime. Recompilation may happen because a function |
| was called with different parameter types, or because an optimistic |
| assumption failed while executing a function with -ot/--optimistic-types. |
| |
| |
| * codegen |
| |
| The code generator is the emitter stage of the code pipeline, and |
| turns the lowest tier of a FunctionNode into bytecode. Codegen logging |
| shows byte codes as they are being emitted, line number information |
| and jumps. It also shows the contents of the bytecode stack prior to |
| each instruction being emitted. This is a good debugging aid. For |
| example: |
| |
| [codegen] #41 line:2 (f)_afc824e |
| [codegen] #42 load symbol x slot=2 |
| [codegen] #43 {1:O} load int 0 |
| [codegen] #44 {2:I O} dynamic_runtime_call GT:ZOI_I args=2 returnType=boolean |
| [codegen] #45 signature (Ljava/lang/Object;I)Z |
| [codegen] #46 {1:Z} ifeq ternary_false_5402fe28 |
| [codegen] #47 load symbol x slot=2 |
| [codegen] #48 {1:O} goto ternary_exit_107c1f2f |
| [codegen] #49 ternary_false_5402fe28 |
| [codegen] #50 load symbol x slot=2 |
| [codegen] #51 {1:O} convert object -> double |
| [codegen] #52 {1:D} neg |
| [codegen] #53 {1:D} convert double -> object |
| [codegen] #54 {1:O} ternary_exit_107c1f2f |
| [codegen] #55 {1:O} return object |
| |
| shows a ternary node being generated for the sequence "return x > 0 ? |
| x : -x" |
| |
| The first number on the log line is a unique monotonically increasing |
| emission id per bytecode. There is no guarantee this is the same id |
| between runs. depending on non deterministic code |
| execution/compilation, but for small applications it usually is. If |
| the system variable -Dnashorn.codegen.debug.trace=<x> is set, where x |
| is a bytecode emission id, a stack trace will be shown as the |
| particular bytecode is about to be emitted. This can be a quick way to |
| determine where it comes from without attaching the debugger. "Who |
| generated that neg?" |
| |
| The --log=codegen option is equivalent to setting the system variable |
| "nashorn.codegen.debug" to true. |
| |
| * fold |
| |
| Shows constant folding taking place before lowering |
| |
| * lower |
| |
| This is the first lowering pass. |
| |
| Lower is a code generation pass that turns high level IR nodes into |
| lower level one, for example substituting comparisons to RuntimeNodes |
| and inlining finally blocks. |
| |
| Lower is also responsible for determining control flow information |
| like end points. |
| |
| * symbols |
| |
| The symbols logger tracks the assignment os symbols to identifiers. |
| |
| * scopedepths |
| |
| This logs the calculation of scope depths for non-local symbols. |
| |
| * fields |
| |
| The --log=fields option (at info level) is equivalent to setting the |
| system variable "nashorn.fields.debug" to true. At the info level it |
| will only show info about type assumptions that were invalidated. If |
| the level is set to finest, it will also trace every AccessorProperty |
| getter and setter in the program, show arguments, return values |
| etc. It will also show the internal representation of respective field |
| (Object in the normal case, unless running with the dual field |
| representation) |
| |
| * time |
| |
| This enables timers for various phases of script compilation. The timers |
| will be dumped when the Nashorn process exits. We see a percentage value |
| of how much time was spent not executing bytecode (i.e. compilation and |
| internal tasks) at the end of the report. |
| |
| A finer level than "info" will show individual compilation timings as they |
| happen. |
| |
| Here is an example: |
| |
| [time] Accumulated complation phase Timings: |
| [time] |
| [time] 'JavaScript Parsing' 1076 ms |
| [time] 'Constant Folding' 159 ms |
| [time] 'Control Flow Lowering' 303 ms |
| [time] 'Program Point Calculation' 282 ms |
| [time] 'Builtin Replacement' 71 ms |
| [time] 'Code Splitting' 670 ms |
| [time] 'Symbol Assignment' 474 ms |
| [time] 'Scope Depth Computation' 249 ms |
| [time] 'Optimistic Type Assignment' 186 ms |
| [time] 'Local Variable Type Calculation' 526 ms |
| [time] 'Bytecode Generation' 5177 ms |
| [time] 'Class Installation' 1854 ms |
| [time] |
| [time] Total runtime: 11994 ms (Non-runtime: 11027 ms [91%]) |
| |
| * methodhandles |
| |
| If this logger is enabled, each MethodHandle related call that uses |
| the java.lang.invoke package gets its MethodHandle intercepted and an |
| instrumentation printout of arguments and return value appended to |
| it. This shows exactly which method handles are executed and from |
| where. (Also MethodTypes and SwitchPoints). |
| |
| * classcache |
| |
| This logger shows information about reusing code classes using the |
| in-memory class cache. Nashorn will try to avoid compilation of |
| scripts by using existing classes. This can significantly improve |
| performance when repeatedly evaluating the same script. |
| |
| ======================= |
| 3. Undocumented options |
| ======================= |
| |
| Here follows a short description of undocumented options for Nashorn. |
| To see a list of all undocumented options, use the (undocumented) flag |
| "-xhelp". |
| |
| i.e. jjs -xhelp or java -jar nashorn.jar -xhelp |
| |
| Undocumented options are not guaranteed to work, run correctly or be |
| bug free. They are experimental and for internal or debugging use. |
| They are also subject to change without notice. |
| |
| In practice, though, all options below not explicitly documented as |
| EXPERIMENTAL can be relied upon, for example --dump-on-error is useful |
| for any JavaScript/Nashorn developer, but there is no guarantee. |
| |
| A short summary follows: |
| |
| -D (-Dname=value. Set a system property. This option can be repeated.) |
| |
| -ccs, --class-cache-size (Size of the Class cache size per global scope.) |
| |
| -cp, -classpath (-cp path. Specify where to find user class files.) |
| |
| -co, --compile-only (Compile without running.) |
| param: [true|false] default: false |
| |
| -d, --dump-debug-dir (specify a destination directory to dump class files.) |
| param: <path> |
| |
| --debug-lines (Generate line number table in .class files.) |
| param: [true|false] default: true |
| |
| --debug-locals (Generate local variable table in .class files.) |
| param: [true|false] default: false |
| |
| -doe, -dump-on-error (Dump a stack trace on errors.) |
| param: [true|false] default: false |
| |
| --early-lvalue-error (invalid lvalue expressions should be reported as early errors.) |
| param: [true|false] default: true |
| |
| --empty-statements (Preserve empty statements in AST.) |
| param: [true|false] default: false |
| |
| -fv, -fullversion (Print full version info of Nashorn.) |
| param: [true|false] default: false |
| |
| --function-statement-error (Report an error when function declaration is used as a statement.) |
| param: [true|false] default: false |
| |
| --function-statement-warning (Warn when function declaration is used as a statement.) |
| param: [true|false] default: false |
| |
| -fx (Launch script as an fx application.) |
| param: [true|false] default: false |
| |
| --global-per-engine (Use single Global instance per script engine instance.) |
| param: [true|false] default: false |
| |
| -h, -help (Print help for command line flags.) |
| param: [true|false] default: false |
| |
| --loader-per-compile (Create a new class loader per compile.) |
| param: [true|false] default: true |
| |
| -l, --locale (Set Locale for script execution.) |
| param: <locale> default: en-US |
| |
| --log (Enable logging of a given level for a given number of sub systems. |
| [for example: --log=fields:finest,codegen:info].) |
| param: <module:level>,* |
| |
| -nj, --no-java (Disable Java support.) |
| param: [true|false] default: false |
| |
| -nse, --no-syntax-extensions (Disallow non-standard syntax extensions.) |
| param: [true|false] default: false |
| |
| -nta, --no-typed-arrays (Disable typed arrays support.) |
| param: [true|false] default: false |
| |
| --parse-only (Parse without compiling.) |
| param: [true|false] default: false |
| |
| --print-ast (Print abstract syntax tree.) |
| param: [true|false] default: false |
| |
| -pc, --print-code (Print generated bytecode. If a directory is specified, nothing will |
| be dumped to stderr. Also, in that case, .dot files will be generated |
| for all functions or for the function with the specified name only.) |
| param: [dir:<output-dir>,function:<name>] |
| |
| --print-lower-ast (Print lowered abstract syntax tree.) |
| param: [true|false] default: false |
| |
| -plp, --print-lower-parse (Print the parse tree after lowering.) |
| param: [true|false] default: false |
| |
| --print-mem-usage (Print memory usage of IR after each compile stage.) |
| param: [true|false] default: false |
| |
| --print-no-newline (Print function will not print new line char.) |
| param: [true|false] default: false |
| |
| -pp, --print-parse (Print the parse tree.) |
| param: [true|false] default: false |
| |
| --print-symbols (Print the symbol table.) |
| param: [true|false] default: false |
| |
| -pcs, --profile-callsites (Dump callsite profile data.) |
| param: [true|false] default: false |
| |
| -scripting (Enable scripting features.) |
| param: [true|false] default: false |
| |
| --stderr (Redirect stderr to a filename or to another tty, e.g. stdout.) |
| param: <output console> |
| |
| --stdout (Redirect stdout to a filename or to another tty, e.g. stderr.) |
| param: <output console> |
| |
| -strict (Run scripts in strict mode.) |
| param: [true|false] default: false |
| |
| -t, -timezone (Set timezone for script execution.) |
| param: <timezone> default: Europe/Stockholm |
| |
| -tcs, --trace-callsites (Enable callsite trace mode. Options are: miss [trace callsite misses] |
| enterexit [trace callsite enter/exit], objects [print object properties].) |
| param: [=[option,]*] |
| |
| --verify-code (Verify byte code before running.) |
| param: [true|false] default: false |
| |
| -v, -version (Print version info of Nashorn.) |
| param: [true|false] default: false |
| |
| -xhelp (Print extended help for command line flags.) |
| param: [true|false] default: false |
| |