Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631112
  • 博文数量: 95
  • 博客积分: 2091
  • 博客等级: 大尉
  • 技术积分: 982
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-05 19:34
文章分类

全部博文(95)

文章存档

2017年(1)

2016年(20)

2015年(10)

2014年(6)

2013年(4)

2012年(1)

2011年(9)

2010年(6)

2009年(20)

2008年(17)

2007年(1)

我的朋友

分类: Java

2008-11-14 13:46:36

转 :

JVM深度历险小记

java 深度历险 小记
=============================
============================
深入J2 SDK
============================
============================
如果安装JDK1.3那么安装程序一定会同时安装两套JRE。
一套位于 jdk\jre目录
一套位于program files\JavaSoft目录
如果是JDK 1.4可以选择是否安装program files\java目录下的jre,但是jdk安装目录下的jre这套jre必须安装

JRE与PC比较

JRE: java类函数库>原生函数库.dll>JAVA虚拟机(jvm.dll)>帮助函数库.dll
PC: Win32 API .dll>CPU

编写好的Java源文件必须要有JRE才能帮助我们运行,Java虚拟机只是JRE里的一个成员而已,或者说jvm只是jre里头一个动态连接函数库,
jdk里面的jre一般用于运行java本身的程序,比如javac,等等.programfiles下面的jre用于运行用户编写的java程序.
JRE下的bin\client 或者 bin\server 的jvm.dll就是JVM了

----------------------------
在刚装好jdk,没有对计算机进行任何设置时,进入命令行窗口


C:\Documents\Administrator>java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)

C:\Documents\Administrator>java -server -version
Error: no `server' JVM at `C:\Program Files\Java\jre1.5.0_11\bin\server\jvm.dll'
-----------------------------------

当设置path路径中包含jdk\bin目录后

----------------------------
C:\>set path="C:\Program Files\Java\jdk1.5.0_11\bin";%path%;

C:\>java -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)

C:\>java -server -version
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Server VM (build 1.5.0_11-b03, mixed mode)

-server 的-version就可以显示出来了
----------------------------

JDK里用Java所写的开发工具 如javac.exe jar.exe都存放在JDK安装目录\lib\tools.jar 这个档案中
javac.exe 只是一个包装器(wrapper),而制作目的是为了让开发者免于输入太长的指令。
实际等于:
java -classpath x:\jdk1.xx\lib\tools.jar com.sun.tools.javac.Main


当用j2me开发palm应用程序的时候,工具会帮我们打包jar档,然后用一个RPC档的外壳罩住,让java程序看起来像是一个原生(native)的应用程序。
用.NET 开发出来的执行文件也是一个包装器的概念。

JDK里面的工具几乎全是用java所写的,所以JDK本身就是Java应用程序,因此要用JDK附的工具来开发Java程序,
也必须要自行附一套JRE才行。这就是JDK安装目录\jre下需要一套JRE的原因。
位于program files\下的那套JRE就是拿来执行我们自己写的java应用程序。不过,两套中任何一套JRE 都可以拿来执行我们所撰写的Java 应用程序,
可是JDK 内附的开发工具在预设使用包装器(.exe) 来启动的情形下,都会自己去选用\jre 底下那套JRE。
------------------------

到底是执行哪一个java.exe
java xxx
当一台机器上有多个jvm可选择的时候,jvm的选择步骤:
1)当前目录有没有jre目录(不准确),
2)父目录下的jre子目录
3)注册表HEKY_LOCAL_MACHINE\SoftWare\Java\Java Runtime Environment\
所以当运行的是jdk\bin\java.exe的时候,用的jre是bin的父目录jdk下面的jre\
运行java.exe找到了jre后有一个验证程序,verify.dll验证jre和java.exe的版本是否一致,如果不一致则会发生错误


一般把常用的工具档放到JDK目录\jre\lib\ext下
把有关安全机制的配置文件放到
JDK目录\jre\lib\security下

调用了其他Java 函数库的程序,在编译阶段没有问题,可是却无法执行,显示ClassNotFoundException的原因可能是:
在system32和jdk\bin目录下都有java.exe 而 javac.exe 只有在jdk\bin目录下有
javac.exe 会自动调用JDK所在目录下的那套JRE ,因此在编译时JVM会找到函数库,所以编译不会发生问题,
但在执行时,键入java xxx的时候会优先执行 system32 下的java.exe
因此会自动调用program files目录下的那套JRE(稍后解释)
所以要执行就必须把外部jar文件放到相应jre\lib\ext目录下

JDK\jre\bin\下有两个目录 server,client
两个目录下都会有jvm.dll
client目录下的jvm.dll较小
server目录下的较大
-----------------------
系统默认path
C:\Documents\Administrator>set path
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

在system32目录 底下找不到JRE 目录,在c:\windows目录 也找不到JRE 目录的情况下,根据下一个逻辑,就是去查询注册表
C:\Program Files\Java\jre1.xx 该目录下的bin 子目录却只有看到client 子目录,却没有看到server 子目录。这就是为何在一开始执行
java -server -version会报错的原因

阅读(1693) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~