• 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异常本身已经给了我们相当大的信息量了

  • 相关阅读:
    poj 3322 不错的搜索题,想通了就很简单的。
    spoj 10649 镜子数的统计(正过来反过去一样)
    搜索第一题(poj 1190)蛋糕
    HashMap和Hashtable的区别
    ajax简单联动查询以及遇到的问题
    PHP之面向对象
    pg_bulkload快速加载数据
    WalMiner
    postgresWAL写放大优化
    postgresql创建统计信息优化
  • 原文地址:https://www.cnblogs.com/diyunpeng/p/2380196.html
Copyright © 2020-2023  润新知