TroubleshootingGuide for JavaTM SE 6withHotSpot TM VM (翻译附录1)

最近看这篇技术白皮书,决定把它翻译出来,所以翻译不好的话,请大家指正:

 

环境变量与系统属性

本节描述环境变量和系统属性,这些环境变量和系统属性能在JVM出现问题时提供帮助。

1、JAVA_HOME环境变量
2、JAVA_TOOL_OPTIONS环境变量
3、java.security.debug系统属性

A.1 JAVA_HOME

 

JAVA_HOME环境变量用来指明JDK软件安装目录(这个一般就是我们安装JDK之后,需要设置环境变量的时候,一般会设置这个变量指定JDK安装目录)

A.2 JAVA_TOOL_OPTIONS

 

在许多环境下,用命令行启动程序并不是容易做的事情。这种情景一般发生程序使用嵌入式JVM(这意味它们使用JNI来启动JVM),或者启动过程在启动脚本深处(译者注,这种情况可能脚本嵌套比较深的情况下,武断的添加参数可能带来潜在的问题,不如集中一点来声明较好),在这些情景下,JAVA_TOOL_OPTIONS环境变量对于使用命令行启动时是十分有帮助的。

当这个环境变量被设置的时候,JNI_CreateJavaVM(这个方法在JNI调用API中)把该环境变量的值设置在它的JavaVMInitArgs参数中的某个选项中。在某种情形下,这个选项因为安全原因而被禁用,例如Solaris操作系统禁用该项当有效用户ID或者组ID与实际用户ID不一致时。

这个环境变量准许你声明初始化工具集,特别是本地语言或Java语言编写的代理,这些代理使用-agenglib或者-javaagent选项启动,在下面的例子中,该环境变量被设置以便HPROF分析器随着程序启动而启动。
    export JAVA_TOOL_OPTIONS="-agentlib:hprof"
这个环境变量也可以用来增强命令行选项以达到诊断目的。例如,你可以提供-XX:OnError选项来声明一个脚本或者命令来被执行当一个致命错误发生时。
因为这个变量在JNI_CreateJavaVM被调用的时候被检查,所以它不能用来增强能够被虚拟机启动时正常处理的命令行选项,例如,VM类型的选择(-client或者-server)
JAVA_TOOL_OPTIOS环境变量在JAVA_TOOL_OPTIONS section of the JVMTool Interface documentation章节中被详细描述 (http://java.sun.com/javase/6/docs/guide/jvmti/jvmti.html#tooloptions).

注: 这个选项按照文档一般在JNI中使用,我没有尝试用过,所以谁用过,请仔细说明一下

 

A.3 java.security.debug

 

java.security.debug系统属性控制着JRE的安全子系统执行时的调试信息是否输出。该选项在当一个SecurityException被抛出的时候,用来诊断与安全管理器相关信息时十分有用。

这个属性可以有如下值:
a、access - 打出所有的checkPermission操作
b、jar - 打出jar验证信息
c、policy - 打出policy信息
d、scl - 打出SecureClassLoader被赋予的权限

下面的子选项可以结合access选项一同使用:
a、stack - 包含堆栈信息
b、domain - 打印出所有上下文的domain
c、failure - 在抛出异常前,打印出堆栈信息以及没有权限访问的domain

例如,为了打印所有checkPermission方法的结果并且跟踪所有上下文中的domain,设置java.security.debug选项为"access,stack",为了跟踪所有访问失败信息,设置该选项为"access,failure"

下面的例子展示了当checkPermission失败时候的信息:

$ java -Djava.security.debug="access,failure" Application
access denied (java.net.SocketPermission server.foobar.com resolve
)
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1158)
at java.security.AccessControlContext.checkPermission
(AccessControlContext.java:253)
at java.security.AccessController.checkPermission(AccessController.java:427)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1031)
at java.net.InetAddress.getAllByName0(InetAddress.java:1117)
at java.net.InetAddress.getAllByName0(InetAddress.java:1098)
at java.net.InetAddress.getAllByName(InetAddress.java:1061)
at java.net.InetAddress.getByName(InetAddress.java:958)
at java.net.InetSocketAddress.<init>(InetSocketAddress.java:124)
at java.net.Socket.<init>(Socket.java:178)
at Test.main(Test.java:7)


如果想要了解更信息的话,请参考Security Tutorial (http://java.sun.com/
developer/onlineTraining/Security/Fundamentals/Security.html).
注:这个还是很重要,能打印出来的话对于调试还是很有用的,当然抛出Security异常本身已经给了我们相当大的信息量了

你可能感兴趣的:(HotSpot)