`

如何动态打开verbose class

    博客分类:
  • java
阅读更多

        在一个Java企业环境中,可能会存在这样那样和类相关的情况,比如类冲突(classloader加载的类不是我们所需要的),perm gen内存泄漏等。出现这样的情况,我们可能需要打开verbose class来trace class的load、unload情况。通过打开verbose class的格式如下:

java %JAVA_OPTIONS% %MEM_ARGS%  -verbose:class MainClass >tmp.out 2>&1

        上述这种方法需要我们重新启动服务器,比如Tomcat、Weblogic等。但如果我们运行的是一个生产系统,重启不是个好的方法。那么除了上述方法,我们能否在不重启服务器的情况下动态打开、关闭verbose class呢?

         JDK的MBean为我们提供了这样的接口,我们可以通过这样的MBean来实现上述需求。MBean提供了大量JVM管理的接口,比如Memory、GarbageCollector、ClassLoading、Thread、Runtime等,更详细的信息可以参考javax.management的API。下面我们看看如果通过程序的方式attach上target JVM,然后打开verbose class。

           对于attach到target jvm我们可以使用如下两种方式:
1:根据process id,即pid
如何获取pid呢?
Windows: netstat -abn | find "7001", 7001是服务器的listening port
Linux/Unix: ps -ef | grep java

 1 public MBeanServerConnection getMBeanServerConnection(long pid)
 2 {
 3     MBeanServerConnection serviceConnection = null;
 4     VirtualMachine vm = null;
 5     try
 6     {
 7         vm = VirtualMachine.attach(String.valueOf(pid));
 8         String connectorAddress =
 9             vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
10         if (connectorAddress == null) {
11             String agent = vm.getSystemProperties().getProperty("java.home") +
12                     File.separator + "lib" + File.separator + "management-agent.jar";
13             vm.loadAgent(agent);
14             connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
15         }
16         if(connectorAddress == null)
17             System.exit(1);
18         serviceConnection = getMBeanServerConnection(connectorAddress);
19     }catch(Exception e){}
20     return serviceConnection;
21 }


2:remote management的listening address及listening port
为了启用remote managed port,我们需要在服务器的启动脚本中加入如下内容,如果你觉得不做验证、non-ssl很不爽,你可以使用SSL及password file做认证,具体可以参考:http://www.j2ee.me/j2se/1.5.0/docs/guide/management/agent.html
set JAVA_OPTIONS=-Dcom.sun.management.jmxremote.port=9192 %JAVA_OPTIONS%
set JAVA_OPTIONS=-Dcom.sun.management.jmxremote.authenticate=false %JAVA_OPTIONS%
set JAVA_OPTIONS=-Dcom.sun.management.jmxremote.ssl=false %JAVA_OPTIONS%

 1 public MBeanServerConnection getMBeanServerConnection(String hostname, String listeningPort)
 2 {
 3     MBeanServerConnection conn = null;
 4     try{
 5         url = "service:jmx:rmi:///jndi/rmi://"+host+":"+port+"/jmxrmi";
 6         JMXServiceURL serviceURL = new JMXServiceURL(url);
 7         connector = JMXConnectorFactory.connect(serviceURL);
 8         conn = connector.getMBeanServerConnection();
 9     }catch(Exception e){
10         e.printStackTrace();
11     }
12     return conn;
13 }


        好了,我们拿到MBeanServerConnection后,说明我们已经attach到target JVM了,有了这个连接,我们可以为所欲为了,夸张了点哈。下面以classloading mbean为例,看看我们如何操作这样的MBean,如果从这些MBean信息,

 1     private void checkClassLoadingInfo(MBeanServerConnection conn)
 2     {
 3         try
 4         {
 5             clMBean = (ClassLoadingMXBean)ManagementFactory.
 6                 newPlatformMXBeanProxy(conn, ManagementFactory.CLASS_LOADING_MXBEAN_NAME, ClassLoadingMXBean.class);
 7         }catch(IOException ioe){}
 8         System.out.println(clMBean.getTotalLoadedClassCount());
 9         System.out.println(clMBean.getLoadedClassCount());
10         System.out.println(clMBean.getUnloadedClassCount());
11         //here we can turn on verbose of class loading dynamically
12         clMBean.setVerbose(true);
13     }


        打开verbose class后,我们就可以看到class loading\unloading相关的信息了,如下:
[Loaded weblogic.servlet.FileServlet from file:/D:/beasys/wls1030/wlserver_10.3/server/lib/weblogic.jar]
[Loaded weblogic.utils.string.CachingDateFormat$ParseCacheHolder from file:/D:/beasys/wls1030/modules/com.bea.core.utils_1.4.0.0.jar]
[Loaded java.lang.StringIndexOutOfBoundsException from d:\beasys\wls1030\JDK160~1\jre\lib\rt.jar]

        有了这些信息,我们就可以根据他们诊断类冲突之类的问题。如果需要关闭verbose class,直接在上面的程序中调用setVerbose(false)就可以了。

        正如前面所说的那样,这样的Mbean有很多,具体的需要你参考JDK的management API。

分享到:
评论

相关推荐

    django创建新闻文章的操作步骤.doc

    - 在D盘根目录下,按住`Shift`键并点击鼠标右键,选择“在此处打开命令窗口”(或“在此处打开Powershell窗口”)。 - 执行命令 `django-admin.exe startproject mynews` 来创建一个新的Django项目,命名为`mynews`...

    Django - 02、从零开始制作仿CSDN博客的网站(建立项目,设计模型)

    打开命令行工具,确保已经安装了Django,然后运行`django-admin startproject csdn_blog`命令,这将创建一个名为`csdn_blog`的项目目录。在这个目录中,包含了管理Django项目的配置文件和启动服务器所需的文件。 接...

    javac命令以及appletviewer命令使用

    这条命令将会打开appletviewer窗口,并显示由`a.class`生成的Applet界面。 **3. 处理带包结构的Applet** 如果`a.java`文件中定义了一个带有包名的类,如`com.example.MyApplet`,那么在HTML文件中引用该Applet时,...

    ANDROIDwindows编译环境搭建.pdf

    -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep ...

    JAVA命令大全(bin目录下命令描述)

    主要用于运行具有图形用户界面(GUI)的应用程序,避免因程序无控制台输出而保持命令行窗口打开。如果GUI程序内部发生异常,窗口会直接关闭,而不是显示异常信息。 4. **javah**: 这个命令用于生成C语言的头文件...

    Android中 信息的输出——Log.v的使用.doc

    在Android Studio中,当我们运行应用并进入调试模式时,可以在IDE的右上角找到“Logcat”面板,或者通过菜单栏的"View -> Tool Windows -> Logcat"来打开。在这里,你可以看到所有日志输出,包括来自系统和其他应用...

    JDK及JRE安装配置是否成功

    如果忘记了 Java JDK 的安装路径,可以在命令提示符中输入:`java -verbose`,在命令行的最后,将显示的是安装的路径。 安装和配置 JDK 和 JRE 是 Java 开发的基础步骤,正确的安装和配置能够确保 Java programs 的...

    精简jre步骤 迷你jre制作过程

    运行java -verbose:class -version > temp.java 命令,此时在bin目录下生成了一个temp.java文件,用EditPlus打开,看到没有,要加载的就是那些类了,把不需要的全部删除就是了。 15. 原来charsets.jar没有加载呀。...

    ANDROID_windows编译环境搭建.pdf

    -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity ``` 通过以上步骤,您可以顺利完成 Android 开发环境的搭建,并创建一...

    java的环境安装与调试 实验报告

    - `-verbose`:输出有关编译器正在执行的操作的消息。 - `-deprecation`:输出使用已过时的API的源位置。 - `-classpath <路径>`:指定查找用户类文件和注释处理程序的位置。 - `-cp <路径>`:指定查找用户类...

    logstash-output-jdbc插件

    接下来,打开终端,导航到Logstash的安装目录(通常包含`bin`子目录),然后执行以下命令: ```bash ./bin/logstash-plugin install file:///root/logstash-output-jdbc.zip ``` 这个命令告诉Logstash从指定的本地...

    Android 4.0及以上版本 ProGuard 代码混淆

    1. **打开 `project.properties` 文件**:首先需要找到项目根目录下的 `project.properties` 文件。 2. **取消注释混淆配置**:找到与 ProGuard 相关的行,例如 `-proguard-config=${sdk.dir}/tools/proguard/...

    EJB轻松学习进阶之五

    在DOS Shell窗口中输入`j2ee –verbose`,这将启动J2EE服务器,并以详细模式运行,以便我们能看到服务器启动过程中的各种信息。当看到"J2EE server startup complete"的提示时,表明服务器已经成功启动并准备好接收...

    21天学通JAVA(高清版)

    - **动态性**:能够在运行时加载、链接和调用类,增强了灵活性。 #### 二、Java平台分类 根据应用场景的不同,Java平台主要分为三大类别: 1. **Java SE (Standard Edition)**:标准版,适用于桌面应用程序和小型...

    matlab for java 配置实例

    - 构建后会在项目路径下生成`src`和`distrib`两个文件夹,其中`src`包含Java源文件`magic.class`,`distrib`包含打包文件`magicsquare.jar`。 3. **选择打包文件**: - 在发布工具面板上点击settings按钮,打开...

    Android反编译 Apktool和dex2jar和gui

    5. 签名并安装:`jarsigner -verbose -keystore your_keystore_file -signedjar signed_apk_file.apk yourUnsignedApkFile.apk yourAliasName` 其次,dex2jar是一个用于将Dalvik字节码(.dex)转换为Java字节码(....

    TESTNG 图解说明

    <suite name="Example Suite" verbose="1"> <class name="com.example.PriorityTest"/> ``` #### 七、TestNG报告 TestNG提供了丰富的报告机制。测试结束后,可以在项目的`TEST-OUTPUT`目录下找到生成的...

    javac不是内部或外部命令解决

    1. **打开环境变量编辑界面**:在“我的电脑”图标上右击,选择“属性”,然后点击“高级”选项卡下的“环境变量”。 2. **添加JAVA_HOME**:在系统变量区域,新建一个变量名`JAVA_HOME`,变量值设为JDK的安装路径...

Global site tag (gtag.js) - Google Analytics