深入JVM一(走近JVM)
一、走近JVM
感觉JVM 这个东西很深澳,网上也很少有这方面的资料,最近有兴趣就打算开始研究起来,做好笔记,以后回来再看。
注:实验的环境为:1.6.0_10-rc2
下面是 JDK提供的帮助文档上一名话,我简单翻译了一下:
原文如下:
我的翻译:
1、 JDK提供了一种或多种 JVM 的实现
l JAVA HotSpot Client VM
2 JAVA HotSpot Server VM
下面我们针对JDK 帮助文档上说的这 2 句话来做测试:
STEP1:
打开命令提示符,输入java 【确保已经配置好环境变量】
大家请看红色框部分。当我们启动一个JAVA 程序的时候,可以选择用 Client 和 Server 虚拟机。
OK,到这里大家对 JVM 的 2 种实现有基本了解,下面我们就写一个程序来试一试,分别让 client 和 server 这 2 个虚拟机来执行我们的程序:
第一步:
新建一个java 文件,敲入以下代码:
public class JVMTest
{
public static void main(String args[])
{
System.out.println("Hello JVM");
}
}
第二步:
编译这个文件:
原文件:
编译:
第三步:用HotSpot client VM 来执行上面的程序,如下图:
大家可以看到,结果正确的执行了。
第四步:用 HotSpot server VM来执行上面的程序,如下图:
这个时候出现一个 error,告诉我们没有 server JVM, 这是由于什么原因呢,在下面的例子中,我会给大家解释,呵呵。
二、 到底有几个JVM
我们自己写的一个JAVA 程序运行的时候,到底是哪个 JVM 来为我们服务的?不知道大家有没有想过这个问题?系统中有几个 JVM ,他们之间有联系吗?还是系统只存在一个 JVM ,所有的程序都由这个 JVM 来执行。
要解决这个问题,我想要用到二个JAVA 提供的工具。
l Jvisualvm
在命令行敲入Jvisualvm :
会出现以下界面:
大家可以看到有一个 local和 remote 选项,
Local:表示本地的 JVM 列表。
Remote:表示远程的 JVM 列表。
Snapshots:请看后方,本节不介绍。
如果你本地没有启动其它的JAVA 应用程序, Local 下面默认就只有一个 JVM 列表,( JVM )。这个就是当前运行 Jvisualvm 命令出来的窗口,这个程序本身也是 JAVA 语言写的。
双击这个JVM ,会出现如下图所示:
我们改一下我们刚刚写的那个程序,代码如下:
public class JVMTest
{
public static void main(String args[])
{
for(int i=0;i<Integer.MAX_VALUE;i++)
{
System.out.println("Hello JVM");
}
}
}
再编译运行这个程序, 注意观察 VisualVM 里的变化:
大家可以看到会多出一个正在运行的JVM 。
总结:一个应用程序会对应一个JVM ,当我们启动一个 JAVA 程序的时候, JDK 会为我们分配一个 JVM 来执行程序。
提示: 在windows 系统上,启动 JvisualVm 的时候可能会出现如下图所示错误:
大家可以点击这个链接,里面有关系错误的详细说明,出现这种情况可能有2 种原因: 1、系统权限不够。 2、安装 JDK 的盘是 fat 格式的
|
如果你喜欢这个文档,你可以下载保存