docs/DEVELOPER_README

Thu, 17 Oct 2019 13:49:11 +0100

author
andrew
date
Thu, 17 Oct 2019 13:49:11 +0100
changeset 2518
6c540cfd2593
parent 1330
d82b07c9c6e3
child 1490
d85f981c8cf8
permissions
-rw-r--r--

Merge

     1 This document describes system properties that are used for internal
     2 debugging and instrumentation purposes, along with the system loggers,
     3 which are used for the same thing.
     5 This document is intended as a developer resource, and it is not
     6 needed as Nashorn documentation for normal usage. Flags and system
     7 properties described herein are subject to change without notice.
     9 =====================================
    10 1. System properties used internally
    11 =====================================
    13 This documentation of the system property flags assume that the
    14 default value of the flag is false, unless otherwise specified.
    16 SYSTEM PROPERTY: -Dnashorn.args=<string>
    18 This property takes as its value a space separated list of Nashorn
    19 command line options that should be passed to Nashorn. This might be
    20 useful in environments where it is hard to tell how a nashorn.jar is
    21 launched.
    23 Example:
    25 > java -Dnashorn.args="--lazy-complation --log=compiler" large-java-app-with-nashorn.jar 
    26 > ant -Dnashorn.args="--log=codegen" antjob
    28 SYSTEM PROPERTY: -Dnashorn.args.prepend=<string>
    30 This property behaves like nashorn.args, but adds the given arguments
    31 before the existing ones instead of after them. Later arguments will
    32 overwrite earlier ones, so this is useful for setting default arguments
    33 that can be overwritten.
    36 SYSTEM PROPERTY: -Dnashorn.unstable.relink.threshold=x
    38 This property controls how many call site misses are allowed before a 
    39 callsite is relinked with "apply" semantics to never change again. 
    40 In the case of megamorphic callsites, this is necessary, or the 
    41 program would spend all its time swapping out callsite targets. Dynalink 
    42 has a default value (currently 8 relinks) for this property if it 
    43 is not explicitly set.
    46 SYSTEM PROPERTY: -Dnashorn.compiler.splitter.threshold=x
    48 This will change the node weight that requires a subgraph of the IR to
    49 be split into several classes in order not to run out of bytecode space.
    50 The default value is 0x8000 (32768).
    53 SYSTEM PROPERTY: -Dnashorn.serialize.compression=<x>
    55 This property sets the compression level used when deflating serialized
    56 AST structures of anonymous split functions. Valid values range from 0 to 9,
    57 the default value is 4. Higher values will reduce memory size of serialized
    58 AST but increase CPU usage required for compression.
    61 SYSTEM PROPERTY: -Dnashorn.codegen.debug.trace=<x>
    63 See the description of the codegen logger below.
    66 SYSTEM PROPERTY: -Dnashorn.fields.objects, -Dnashorn.fields.dual
    68 When the nashorn.fields.objects property is true, Nashorn will always
    69 use object fields for AccessorProperties, requiring boxing for all
    70 primitive property values. When nashorn.fields.dual is set, Nashorn
    71 will always use dual long/object fields, which allows primitives to be
    72 stored without boxing. When neither system property is set, Nashorn
    73 chooses a setting depending on the optimistic types setting (dual
    74 fields when optimistic types are enabled, object-only fields otherwise).
    76 With dual fields, Nashorn uses long fields to store primitive values.
    77 Ints are represented as the 32 low bits of the long fields. Doubles
    78 are represented as the doubleToLongBits of their value. This way a
    79 single field can be used for all primitive types. Packing and
    80 unpacking doubles to their bit representation is intrinsified by
    81 the JVM and extremely fast.
    83 In the future, this might complement or be replaced by experimental
    84 feature sun.misc.TaggedArray, which has been discussed on the mlvm
    85 mailing list. TaggedArrays are basically a way to share data space
    86 between primitives and references, and have the GC understand this.
    89 SYSTEM PROPERTY: -Dnashorn.compiler.symbol.trace=[<x>[,*]], 
    90   -Dnashorn.compiler.symbol.stacktrace=[<x>[,*]]
    92 When this property is set, creation and manipulation of any symbol
    93 named "x" will show information about when the compiler changes its
    94 type assumption, bytecode local variable slot assignment and other
    95 data. This is useful if, for example, a symbol shows up as an Object,
    96 when you believe it should be a primitive. Usually there is an
    97 explanation for this, for example that it exists in the global scope
    98 and type analysis has to be more conservative. 
   100 Several symbols names to watch can be specified by comma separation.
   102 If no variable name is specified (and no equals sign), all symbols
   103 will be watched
   105 By using "stacktrace" instead of or together with "trace", stack
   106 traces will be displayed upon symbol changes according to the same
   107 semantics.
   110 SYSTEM PROPERTY: -Dnashorn.lexer.xmlliterals
   112 If this property it set, it means that the Lexer should attempt to
   113 parse XML literals, which would otherwise generate syntax
   114 errors. Warning: there are currently no unit tests for this
   115 functionality.
   117 XML literals, when this is enabled, end up as standard LiteralNodes in
   118 the IR.
   121 SYSTEM_PROPERTY: -Dnashorn.debug
   123 If this property is set to true, Nashorn runs in Debug mode. Debug
   124 mode is slightly slower, as for example statistics counters are enabled
   125 during the run. Debug mode makes available a NativeDebug instance
   126 called "Debug" in the global space that can be used to print property
   127 maps and layout for script objects, as well as a "dumpCounters" method
   128 that will print the current values of the previously mentioned stats
   129 counters.
   131 These functions currently exists for Debug:
   133 "map" - print(Debug.map(x)) will dump the PropertyMap for object x to
   134 stdout (currently there also exist functions called "embedX", where X
   135 is a value from 0 to 3, that will dump the contents of the embed pool
   136 for the first spill properties in any script object and "spill", that
   137 will dump the contents of the growing spill pool of spill properties
   138 in any script object. This is of course subject to change without
   139 notice, should we change the script object layout.
   141 "methodHandle" - this method returns the method handle that is used
   142 for invoking a particular script function.
   144 "identical" - this method compares two script objects for reference
   145 equality. It is a == Java comparison
   147 "equals" - Returns true if two objects are either referentially
   148 identical or equal as defined by java.lang.Object.equals.
   150 "dumpCounters" - will dump the debug counters' current values to
   151 stdout.
   153 Currently we count number of ScriptObjects in the system, number of
   154 Scope objects in the system, number of ScriptObject listeners added,
   155 removed and dead (without references).
   157 We also count number of ScriptFunctions, ScriptFunction invocations
   158 and ScriptFunction allocations.
   160 Furthermore we count PropertyMap statistics: how many property maps
   161 exist, how many times were property maps cloned, how many times did
   162 the property map history cache hit, prevent new allocations, how many
   163 prototype invalidations were done, how many time the property map
   164 proto cache hit.
   166 Finally we count callsite misses on a per callsite bases, which occur
   167 when a callsite has to be relinked, due to a previous assumption of
   168 object layout being invalidated.
   170 "getContext" - return the current Nashorn context.
   172 "equalWithoutType" - Returns true if if the two objects are both
   173 property maps, and they have identical properties in the same order,
   174 but allows the properties to differ in their types.
   176 "diffPropertyMaps" Returns a diagnostic string representing the difference
   177 of two property maps.
   179 "getClass" - Returns the Java class of an object, or undefined if null.
   181 "toJavaString" - Returns the Java toString representation of an object.
   183 "toIdentString" - Returns a string representation of an object consisting
   184 of its java class name and hash code.
   186 "getListenerCount" - Return the number of property listeners for a
   187 script object.
   189 "getEventQueueCapacity" - Get the capacity of the event queue.
   191 "setEventQueueCapacity" - Set the event queue capacity.
   193 "addRuntimeEvent" - Add a runtime event to the runtime event queue.
   194 The queue has a fixed size (see -Dnashorn.runtime.event.queue.size)
   195 and the oldest entry will be thrown out of the queue is about to overflow.
   197 "expandEventQueueCapacity" - Expands the event queue capacity,
   198 or truncates if capacity is lower than current capacity. Then only
   199 the newest entries are kept.
   201 "clearRuntimeEvents" - Clear the runtime event queue.
   203 "removeRuntimeEvent" - Remove a specific runtime event from the event queue.
   205 "getRuntimeEvents" - Return all runtime events in the queue as an array.
   207 "getLastRuntimeEvent" - Return the last runtime event in the queue.
   210 SYSTEM PROPERTY: -Dnashorn.methodhandles.debug.stacktrace
   212 This enhances methodhandles logging (see below) to also dump the
   213 stack trace for every instrumented method handle operation.
   214 Warning: This is enormously verbose, but provides a pretty
   215 decent "grep:able" picture of where the calls are coming from.
   218 SYSTEM PROPERTY: -Dnashorn.cce
   220 Setting this system property causes the Nashorn linker to rely on
   221 ClassCastExceptions for triggering a callsite relink. If not set, the linker
   222 will add an explicit instanceof guard.
   225 SYSTEM PROPERTY: -Dnashorn.spill.threshold=<x>
   227 This property sets the number of fields in an object from which to use
   228 generic array based spill storage instead of Java fields. The default value
   229 is 256.
   232 SYSTEM PROPERTY: -Dnashorn.tcs.miss.samplePercent=<x>
   234 When running with the trace callsite option (-tcs), Nashorn will count
   235 and instrument any callsite misses that require relinking. As the
   236 number of relinks is large and usually produces a lot of output, this
   237 system property can be used to constrain the percentage of misses that
   238 should be logged. Typically this is set to 1 or 5 (percent). 1% is the
   239 default value.
   241 SYSTEM PROPERTY: -Dnashorn.persistent.code.cache
   243 This property can be used to set the directory where Nashorn stores
   244 serialized script classes generated with the -pcc/--persistent-code-cache
   245 option. The default directory name is "nashorn_code_cache".
   248 SYSTEM PROPERTY: -Dnashorn.typeInfo.maxFiles
   250 Maximum number of files to store in the type info cache. The type info cache
   251 is used to cache type data of JavaScript functions when running with
   252 optimistic types (-ot/--optimistic-types). There is one file per JavaScript
   253 function in the cache.
   255 The default value is 0 which means the feature is disabled. Setting this
   256 to something like 20000 is probably good enough for most applications and
   257 will usually cap the cache directory to about 80MB presuming a 4kB
   258 filesystem allocation unit. Set this to "unlimited" to run without limit.
   260 If the value is not 0 or "unlimited", Nashorn will spawn a cleanup thread
   261 that makes sure the number of files in the cache does not exceed the given
   262 value by deleting the least recently modified files.
   265 SYSTEM PROPERTY: -Dnashorn.typeInfo.cacheDir
   267 This property can be used to set the directory where Nashorn stores the
   268 type info cache when -Dnashorn.typeInfo.maxFiles is set to a nonzero
   269 value. The default location is platform specific. On Windows, it is
   270 "${java.io.tmpdir}\com.oracle.java.NashornTypeInfo". On Linux and
   271 Solaris it is "~/.cache/com.oracle.java.NashornTypeInfo". On Mac OS X,
   272 it is "~/Library/Caches/com.oracle.java.NashornTypeInfo".
   275 SYSTEM PROPERTY: -Dnashorn.typeInfo.cleanupDelaySeconds=<value>
   277 This sets the delay between cleanups of the typeInfo cache, in seconds.
   278 The default delay is 20 seconds.
   281 SYSTEM PROPERTY: -Dnashorn.profilefile=<filename>
   283 When running with the profile callsite options (-pcs), Nashorn will
   284 dump profiling data for all callsites to stderr as a shutdown hook. To
   285 instead redirect this to a file, specify the path to the file using
   286 this system property.
   289 SYSTEM_PROPERTY: -Dnashorn.regexp.impl=[jdk|joni]
   291 This property defines the regular expression engine to be used by
   292 Nashorn. Set this flag to "jdk" to get an implementation based on the
   293 JDK's java.util.regex package. Set this property to "joni" to install
   294 an implementation based on Joni, the regular expression engine used by
   295 the JRuby project. The default value for this flag is "joni"
   297 SYSTEM PROPERTY: -Dnashorn.runtime.event.queue.size=<value>
   299 Nashorn provides a fixed sized runtime event queue for debugging purposes.
   300 See -Dnashorn.debug for methods to access the event queue.
   301 The default value is 1024.
   303 ===============
   304 2. The loggers.
   305 ===============
   307 It is very simple to create your own logger. Use the DebugLogger class
   308 and give the subsystem name as a constructor argument.
   310 The Nashorn loggers can be used to print per-module or per-subsystem
   311 debug information with different levels of verbosity. The loggers for
   312 a given subsystem are available are enabled by using
   314 --log=<systemname>[:<level>]
   316 on the command line.
   318 Here <systemname> identifies the name of the subsystem to be logged
   319 and the optional colon and level argument is a standard
   320 java.util.logging.Level name (severe, warning, info, config, fine,
   321 finer, finest). If the level is left out for a particular subsystem,
   322 it defaults to "info". Any log message logged as the level or a level
   323 that is more important will be output to stderr by the logger.
   325 Several loggers can be enabled by a single command line option, by
   326 putting a comma after each subsystem/level tuple (or each subsystem if
   327 level is unspecified). The --log option can also be given multiple
   328 times on the same command line, with the same effect.
   330 For example: --log=codegen,fields:finest is equivalent to
   331 --log=codegen:info --log=fields:finest
   333 The following is an incomplete list of subsystems that currently
   334 support logging. Look for classes implementing
   335 jdk.nashorn.internal.runtime.logging.Loggable for more loggers.
   338 * compiler
   340 The compiler is in charge of turning source code and function nodes
   341 into byte code, and installs the classes into a class loader
   342 controlled from the Context. Log messages are, for example, about
   343 things like new compile units being allocated. The compiler has global
   344 settings that all the tiers of codegen (e.g. Lower and CodeGenerator)
   345 use.s
   348 * recompile
   350 This logger shows information about recompilation of scripts and
   351 functions at runtime. Recompilation may happen because a function
   352 was called with different parameter types, or because an optimistic
   353 assumption failed while executing a function with -ot/--optimistic-types.
   356 * codegen
   358 The code generator is the emitter stage of the code pipeline, and
   359 turns the lowest tier of a FunctionNode into bytecode. Codegen logging
   360 shows byte codes as they are being emitted, line number information
   361 and jumps. It also shows the contents of the bytecode stack prior to
   362 each instruction being emitted. This is a good debugging aid. For
   363 example:
   365 [codegen] #41                       line:2 (f)_afc824e 
   366 [codegen] #42                           load symbol x slot=2 
   367 [codegen] #43  {1:O}                    load int 0 
   368 [codegen] #44  {2:I O}                  dynamic_runtime_call GT:ZOI_I args=2 returnType=boolean 
   369 [codegen] #45                              signature (Ljava/lang/Object;I)Z 
   370 [codegen] #46  {1:Z}                    ifeq  ternary_false_5402fe28 
   371 [codegen] #47                           load symbol x slot=2 
   372 [codegen] #48  {1:O}                    goto ternary_exit_107c1f2f 
   373 [codegen] #49                       ternary_false_5402fe28 
   374 [codegen] #50                           load symbol x slot=2 
   375 [codegen] #51  {1:O}                    convert object -> double 
   376 [codegen] #52  {1:D}                    neg 
   377 [codegen] #53  {1:D}                    convert double -> object 
   378 [codegen] #54  {1:O}                ternary_exit_107c1f2f 
   379 [codegen] #55  {1:O}                    return object 
   381 shows a ternary node being generated for the sequence "return x > 0 ?
   382 x : -x"
   384 The first number on the log line is a unique monotonically increasing
   385 emission id per bytecode. There is no guarantee this is the same id
   386 between runs.  depending on non deterministic code
   387 execution/compilation, but for small applications it usually is. If
   388 the system variable -Dnashorn.codegen.debug.trace=<x> is set, where x
   389 is a bytecode emission id, a stack trace will be shown as the
   390 particular bytecode is about to be emitted. This can be a quick way to
   391 determine where it comes from without attaching the debugger. "Who
   392 generated that neg?"
   394 The --log=codegen option is equivalent to setting the system variable
   395 "nashorn.codegen.debug" to true.
   397 * fold
   399 Shows constant folding taking place before lowering
   401 * lower
   403 This is the first lowering pass.
   405 Lower is a code generation pass that turns high level IR nodes into
   406 lower level one, for example substituting comparisons to RuntimeNodes
   407 and inlining finally blocks.
   409 Lower is also responsible for determining control flow information
   410 like end points.
   412 * symbols
   414 The symbols logger tracks the assignment os symbols to identifiers.
   416 * scopedepths
   418 This logs the calculation of scope depths for non-local symbols.
   420 * fields
   422 The --log=fields option (at info level) is equivalent to setting the
   423 system variable "nashorn.fields.debug" to true. At the info level it
   424 will only show info about type assumptions that were invalidated. If
   425 the level is set to finest, it will also trace every AccessorProperty
   426 getter and setter in the program, show arguments, return values
   427 etc. It will also show the internal representation of respective field
   428 (Object in the normal case, unless running with the dual field
   429 representation)
   431 * time
   433 This enables timers for various phases of script compilation. The timers
   434 will be dumped when the Nashorn process exits. We see a percentage value
   435 of how much time was spent not executing bytecode (i.e. compilation and
   436 internal tasks) at the end of the report. 
   438 A finer level than "info" will show individual compilation timings as they
   439 happen.
   441 Here is an example:
   443 [time] Accumulated complation phase Timings:
   444 [time] 
   445 [time] 'JavaScript Parsing'              1076 ms
   446 [time] 'Constant Folding'                 159 ms
   447 [time] 'Control Flow Lowering'            303 ms
   448 [time] 'Program Point Calculation'        282 ms
   449 [time] 'Builtin Replacement'               71 ms
   450 [time] 'Code Splitting'                   670 ms
   451 [time] 'Symbol Assignment'                474 ms
   452 [time] 'Scope Depth Computation'          249 ms
   453 [time] 'Optimistic Type Assignment'       186 ms
   454 [time] 'Local Variable Type Calculation'  526 ms
   455 [time] 'Bytecode Generation'             5177 ms
   456 [time] 'Class Installation'              1854 ms
   457 [time] 
   458 [time] Total runtime: 11994 ms (Non-runtime: 11027 ms [91%])
   460 * methodhandles
   462 If this logger is enabled, each MethodHandle related call that uses
   463 the java.lang.invoke package gets its MethodHandle intercepted and an
   464 instrumentation printout of arguments and return value appended to
   465 it. This shows exactly which method handles are executed and from
   466 where. (Also MethodTypes and SwitchPoints).
   468 * classcache
   470 This logger shows information about reusing code classes using the
   471 in-memory class cache. Nashorn will try to avoid compilation of
   472 scripts by using existing classes. This can significantly improve
   473 performance when repeatedly evaluating the same script.
   475 =======================
   476 3. Undocumented options
   477 =======================
   479 Here follows a short description of undocumented options for Nashorn.
   480 To see a list of all undocumented options, use the (undocumented) flag
   481 "-xhelp".
   483 i.e. jjs -xhelp or java -jar nashorn.jar -xhelp
   485 Undocumented options are not guaranteed to work, run correctly or be
   486 bug free. They are experimental and for internal or debugging use.
   487 They are also subject to change without notice.
   489 In practice, though, all options below not explicitly documented as
   490 EXPERIMENTAL can be relied upon, for example --dump-on-error is useful
   491 for any JavaScript/Nashorn developer, but there is no guarantee.
   493 A short summary follows:
   495 	-D (-Dname=value. Set a system property. This option can be repeated.)
   497 	-ccs, --class-cache-size (Size of the Class cache size per global scope.)
   499 	-cp, -classpath (-cp path. Specify where to find user class files.)
   501 	-co, --compile-only (Compile without running.)
   502 		param: [true|false]   default: false
   504 	-d, --dump-debug-dir (specify a destination directory to dump class files.)
   505 		param: <path>   
   507 	--debug-lines (Generate line number table in .class files.)
   508 		param: [true|false]   default: true
   510 	--debug-locals (Generate local variable table in .class files.)
   511 		param: [true|false]   default: false
   513 	-doe, -dump-on-error (Dump a stack trace on errors.)
   514 		param: [true|false]   default: false
   516 	--early-lvalue-error (invalid lvalue expressions should be reported as early errors.)
   517 		param: [true|false]   default: true
   519 	--empty-statements (Preserve empty statements in AST.)
   520 		param: [true|false]   default: false
   522 	-fv, -fullversion (Print full version info of Nashorn.)
   523 		param: [true|false]   default: false
   525 	--function-statement-error (Report an error when function declaration is used as a statement.)
   526 		param: [true|false]   default: false
   528 	--function-statement-warning (Warn when function declaration is used as a statement.)
   529 		param: [true|false]   default: false
   531 	-fx (Launch script as an fx application.)
   532 		param: [true|false]   default: false
   534 	--global-per-engine (Use single Global instance per script engine instance.)
   535 		param: [true|false]   default: false
   537 	-h, -help (Print help for command line flags.)
   538 		param: [true|false]   default: false
   540 	--loader-per-compile (Create a new class loader per compile.)
   541 		param: [true|false]   default: true
   543 	-l, --locale (Set Locale for script execution.)
   544 		param: <locale>   default: en-US
   546 	--log (Enable logging of a given level for a given number of sub systems. 
   547 	      [for example: --log=fields:finest,codegen:info].)
   548 		param: <module:level>,*   
   550 	-nj, --no-java (Disable Java support.)
   551 		param: [true|false]   default: false
   553 	-nse, --no-syntax-extensions (Disallow non-standard syntax extensions.)
   554 		param: [true|false]   default: false
   556 	-nta, --no-typed-arrays (Disable typed arrays support.)
   557 		param: [true|false]   default: false
   559 	--parse-only (Parse without compiling.)
   560 		param: [true|false]   default: false
   562 	--print-ast (Print abstract syntax tree.)
   563 		param: [true|false]   default: false
   565 	-pc, --print-code (Print generated bytecode. If a directory is specified, nothing will 
   566 	                  be dumped to stderr. Also, in that case, .dot files will be generated 
   567 	                  for all functions or for the function with the specified name only.)
   568 		param: [dir:<output-dir>,function:<name>]   
   570 	--print-lower-ast (Print lowered abstract syntax tree.)
   571 		param: [true|false]   default: false
   573 	-plp, --print-lower-parse (Print the parse tree after lowering.)
   574 		param: [true|false]   default: false
   576 	--print-mem-usage (Print memory usage of IR after each compile stage.)
   577 		param: [true|false]   default: false
   579 	--print-no-newline (Print function will not print new line char.)
   580 		param: [true|false]   default: false
   582 	-pp, --print-parse (Print the parse tree.)
   583 		param: [true|false]   default: false
   585 	--print-symbols (Print the symbol table.)
   586 		param: [true|false]   default: false
   588 	-pcs, --profile-callsites (Dump callsite profile data.)
   589 		param: [true|false]   default: false
   591 	-scripting (Enable scripting features.)
   592 		param: [true|false]   default: false
   594 	--stderr (Redirect stderr to a filename or to another tty, e.g. stdout.)
   595 		param: <output console>   
   597 	--stdout (Redirect stdout to a filename or to another tty, e.g. stderr.)
   598 		param: <output console>   
   600 	-strict (Run scripts in strict mode.)
   601 		param: [true|false]   default: false
   603 	-t, -timezone (Set timezone for script execution.)
   604 		param: <timezone>   default: Europe/Stockholm
   606 	-tcs, --trace-callsites (Enable callsite trace mode. Options are: miss [trace callsite misses] 
   607 	                         enterexit [trace callsite enter/exit], objects [print object properties].)
   608 		param: [=[option,]*]   
   610 	--verify-code (Verify byte code before running.)
   611 		param: [true|false]   default: false
   613 	-v, -version (Print version info of Nashorn.)
   614 		param: [true|false]   default: false
   616 	-xhelp (Print extended help for command line flags.)
   617 		param: [true|false]   default: false

mercurial