在一个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
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%
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信息,
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。
相关推荐
- 在D盘根目录下,按住`Shift`键并点击鼠标右键,选择“在此处打开命令窗口”(或“在此处打开Powershell窗口”)。 - 执行命令 `django-admin.exe startproject mynews` 来创建一个新的Django项目,命名为`mynews`...
打开命令行工具,确保已经安装了Django,然后运行`django-admin startproject csdn_blog`命令,这将创建一个名为`csdn_blog`的项目目录。在这个目录中,包含了管理Django项目的配置文件和启动服务器所需的文件。 接...
这条命令将会打开appletviewer窗口,并显示由`a.class`生成的Applet界面。 **3. 处理带包结构的Applet** 如果`a.java`文件中定义了一个带有包名的类,如`com.example.MyApplet`,那么在HTML文件中引用该Applet时,...
-verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep ...
主要用于运行具有图形用户界面(GUI)的应用程序,避免因程序无控制台输出而保持命令行窗口打开。如果GUI程序内部发生异常,窗口会直接关闭,而不是显示异常信息。 4. **javah**: 这个命令用于生成C语言的头文件...
在Android Studio中,当我们运行应用并进入调试模式时,可以在IDE的右上角找到“Logcat”面板,或者通过菜单栏的"View -> Tool Windows -> Logcat"来打开。在这里,你可以看到所有日志输出,包括来自系统和其他应用...
如果忘记了 Java JDK 的安装路径,可以在命令提示符中输入:`java -verbose`,在命令行的最后,将显示的是安装的路径。 安装和配置 JDK 和 JRE 是 Java 开发的基础步骤,正确的安装和配置能够确保 Java programs 的...
运行java -verbose:class -version > temp.java 命令,此时在bin目录下生成了一个temp.java文件,用EditPlus打开,看到没有,要加载的就是那些类了,把不需要的全部删除就是了。 15. 原来charsets.jar没有加载呀。...
-verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity ``` 通过以上步骤,您可以顺利完成 Android 开发环境的搭建,并创建一...
- `-verbose`:输出有关编译器正在执行的操作的消息。 - `-deprecation`:输出使用已过时的API的源位置。 - `-classpath <路径>`:指定查找用户类文件和注释处理程序的位置。 - `-cp <路径>`:指定查找用户类...
接下来,打开终端,导航到Logstash的安装目录(通常包含`bin`子目录),然后执行以下命令: ```bash ./bin/logstash-plugin install file:///root/logstash-output-jdbc.zip ``` 这个命令告诉Logstash从指定的本地...
1. **打开 `project.properties` 文件**:首先需要找到项目根目录下的 `project.properties` 文件。 2. **取消注释混淆配置**:找到与 ProGuard 相关的行,例如 `-proguard-config=${sdk.dir}/tools/proguard/...
在DOS Shell窗口中输入`j2ee –verbose`,这将启动J2EE服务器,并以详细模式运行,以便我们能看到服务器启动过程中的各种信息。当看到"J2EE server startup complete"的提示时,表明服务器已经成功启动并准备好接收...
- **动态性**:能够在运行时加载、链接和调用类,增强了灵活性。 #### 二、Java平台分类 根据应用场景的不同,Java平台主要分为三大类别: 1. **Java SE (Standard Edition)**:标准版,适用于桌面应用程序和小型...
- 构建后会在项目路径下生成`src`和`distrib`两个文件夹,其中`src`包含Java源文件`magic.class`,`distrib`包含打包文件`magicsquare.jar`。 3. **选择打包文件**: - 在发布工具面板上点击settings按钮,打开...
5. 签名并安装:`jarsigner -verbose -keystore your_keystore_file -signedjar signed_apk_file.apk yourUnsignedApkFile.apk yourAliasName` 其次,dex2jar是一个用于将Dalvik字节码(.dex)转换为Java字节码(....
<suite name="Example Suite" verbose="1"> <class name="com.example.PriorityTest"/> ``` #### 七、TestNG报告 TestNG提供了丰富的报告机制。测试结束后,可以在项目的`TEST-OUTPUT`目录下找到生成的...
1. **打开环境变量编辑界面**:在“我的电脑”图标上右击,选择“属性”,然后点击“高级”选项卡下的“环境变量”。 2. **添加JAVA_HOME**:在系统变量区域,新建一个变量名`JAVA_HOME`,变量值设为JDK的安装路径...