- 浏览: 473061 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
zjxkeven:
放在自己工程上不报错,已放在服务器上就报错
java获得CPU使用率,系统内存,虚拟机内存等情况 -
wang1990cool:
能运行?我报错啊、
java获得CPU使用率,系统内存,虚拟机内存等情况 -
yue_ch:
yue_ch 写道getTotalPhysicalMemory ...
java获得CPU使用率,系统内存,虚拟机内存等情况 -
yue_ch:
getTotalPhysicalMemorySize()get ...
java获得CPU使用率,系统内存,虚拟机内存等情况 -
kjmmlzq19851226:
private RealSubject realSubject ...
代理模式,静态代理与动态代理
概念比较:
Java C#
byte code IL(字节码,中间语言)
jvm.dll mscrolib.dll,mscrojit.dll(虚拟机)
JRE CLR(运行环境)
JDK .Net Framework(开发框架)
package assembly(类库,程序集)
一、关于类库的版本管理问题
Java和C#代码运行要依靠其运行环境(JRE,CLR)和运行环境带的基础类库(C#称为配件或者程序集Assembly),此外还会有一些第三方的类库或者自己开发的类库。如果运行环境版本不一致,或者引用的类库版本不一致都会带来程序不能正常运行。比如一个Java程序是在JDK1.2上开发,如果在JRE1.4上运行,一般情况下可以向下兼容,但也有例外,有些GUI程序在JDK1.4上面运行结果很可能会不同。
JRE的版本管理
Java的解决办法是每个程序自己携带一套JRE。
我的机器上已经被安装了好多套JRE和JDK了(JDK包括了同版本的JRE,此外还包括有编译器和其它工具),它们分别是:
BEA Weblogic Server 7.0 自带一套 JDK1.3.1_02
我下载了一套最新的JDK1.4.1_02
JBuilder9自带一套JKD1.4.1_02
Oracle8.1.7自带一套JRE1.1.7
Ration Rose自带一套JDK1.3
DreamWeaver自带一套JDK1.3
6套JRE,每套JRE都被各自安装到不同的目录,不会互相影响。当在控制台执行java.exe,操作系统寻找JRE的方式如下:
先找当前目录下有没有JRE
再找父目录下有没有JRE
接着在PATH路径中找JRE
注册表HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\ 查看CurrentVersion的键值指向哪个JRE
最常用的是在PATH路径中找JRE,一般情况下,自己的程序运行之前都会先在批处理文件里面临时设置PATH,把自己用的JRE放到PATH路径最前面,所以肯定会运行自己带的JRE,不会造成版本混乱。
.Net Framework的版本管理
.Net Framework被固定安装在C:\Winnt\Microsoft.NET\Framework\v版本号\目录下,听说刚发行的.Net Framework1.1已经对1.0做了很多改进,也许在旧版本的.Net Framework开发的程序在往新版本上面迁移的时候需要部分修改。
JRE的基础类库
JRE自带的基础类库主要是JRE\lib\rt.jar这个文件,包括了Java2平台标准版的所有类库。和JRE的版本一致。
.Net Framekwork的核心类库
.Net Framekwork的核心类库被放置在C:\Winnt\assembly\gac\目录下,按照不同的名称空间放在不同目录中,不像JRE打成了一个包。并且可以同时存在不同的版本,例如:
某类库1.0版本 C:\Winnt\assembly\gac\名称\1.0\名称.dll
某类库1.1版本 C:\Winnt\assembly\gac\名称\1.1\名称.dll
这样做,虽然很灵活,可以随时把类库更新到最新的状态,但是很容易带来版本管理的复杂度,造成版本不一致。
JRE类库的查找方法和版本管理
JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则,放在CLASSPATH前面的类库先被搜到,Java程序启动之前建议先把PATH和CLASSPATH环境变量设好,OS通过PATH来找JRE,确定基础类库rt.jar的位置,JRE的ClassLoader通过CLASSPATH找其它类库。但有时候会出现这样的情况,希望替换基础类库中的类库,那么也可以简单的通过-Djava.endrosed.path=...参数传递给java.exe,于是ClassLoader会先于基础类库使用java.endrosed.path参数指定路径的类库。因此Java的版本管理是非常简单有效的,也许很原始,不过很好用,简单就不容易出错。(所以我很奇怪Eric Ramond为什么批评Java的类库管理机制,他还居然批评Java的接口,令人怀疑他对Java的了解程度)
.Net Framework的类库管理机制
.Net Framework的类库管理机制相当强大和复杂,分为私有类库和共享类库。
私有类库就放在exe程序当前路径下,或其相对路径中,只有当前程序可见。
共享类库需要在GAC(Global Assembly Cache)中注册,注册过程比较复杂,首先要用工具生成公开/私有密钥对,然后结合密钥和类库版本号连编,最后使用工具注册到GAC中好以后,会被放在"C:\Winnt\assembly\gac\类库的名称空间\版本号\"目录下,不同的类库版本在注册的时候会按照版本号分开放置:
某类库1.0版本 C:\Winnt\assembly\gac\名称\1.0\名称.dll
某类库1.1版本 C:\Winnt\assembly\gac\名称\1.1\名称.dll
也就是可以同时存在一个类库的n个版本,至于在程序中用哪个版本,在程序的配置文件中声明,CLR会根据声明来调用相应的版本的类库。我觉得.Net实现方法未免太复杂了一些,将所有共享类库都塞到一个系统目录下,并且同一个类库还有n个版本,将来.Net第三方开发的类库逐渐丰富起来以后,.Net类库的GAC也会越来越庞大,会不会也搞得和Windows注册表一样难以维护?软件发布到服务器上的时候,类库要再注册一次,服务器会逐渐形成一个庞大的树状的GAC,GAC里面存放着组件的n个版本。试想经过一段时间之后,C:\Winnt\assembly\gac\目录会越来越庞大,有的组件甚至有n个版本都放在那里,你又不敢随便删除,不知道是不是有程序需要使用,我不明白MS为什么要把这么简单的事情搞到这么复杂?
综上所述,Java的版本管理方式简单而有效,C#的版本管理方式功能强大,不过是不是太复杂了?会不会搞成第二个注册表一样的东西?
二、虚拟机启动和加载类库的方式
Java的虚拟机启动和加载类库
在Console执行java.exe xxx命令以后,如前所述的寻找JRE,OS找到JRE目录,根据java.exe的传递参数,选择加载Server版的jvm.dll还是Client版的jvm.dll,然后加载jvm.dll,把控制权交给jvm.dll。
接下来,jvm.dll进行初始化,分配内存等等动作,然后在CLASSPATH路径中寻找class,找到class以后,寻找class中的程序入口点Main函数,然后从Main函数执行程序,在执行过程中,使用ClassLoader动态加载一系列引用到的类。当调用到native方法时,jvm.dll告诉OS在JRE\bin目录下寻找某某DLL文件,调入内存,于是实现了JNI调用。
.Net的虚拟机的启动推测
我对.Net的虚拟机的启动过程还一知半解,自己写了一些例程,并且用内存工具来检测观察,推测.Net的运行机制,先来抛砖引玉,请熟悉Windows平台编程的朋友指教。.Net有3个目录中的文件在执行的时候会被加载
1、C:\WINNT\Microsoft.NET\Framework\v版本号\
该目录下的mscorlib.dll,mscorrsn.dll,mscorwsk.dll,mscorjit.dll是核心DLL,大概是运行虚拟机的必要文件,其中mscrolib.dll是入口点。此外,该目录下还有一些.Net的System名称空间的IL类库,与C:\Winnt\assembly\gac\相应目录下的IL类库完全一样,这些是最核心的基础类库。.Net的编译器,检查器等等工具软件也在该目录,推测System名称空间的核心类库之所以在这个目录下copy一份是因为作为.Net的编译器等工具的私有类库之用。
2、C:\Winnt\assembly\gac\
该目录下放置.Net共享类库,如前所述
3、C:\Winnt\assembly\nativeimages_.Net版本号\
在该目录下也有一些以System名称空间开头的核心类库,推测是MS为了加快CLR的执行效率把核心类库进行本地化,编译为native image的同名DLL。可以观察到该目录下的同名DLL文件,比GAC目录下的同名DLL文件体积大,可能是因为link底层DLL库的缘故。
某核心类库 C:\Winnt\assembly\nativeimages_.Net版本号\名称空间\.Net版本号_散列码\名称.dll
另外值得注意的地方是有两个mscorlib.dll
1、C:\WINNT\Microsoft.NET\Framework\v版本号\mscrolib.dll (1.88MB)
2、C:\WINNT\assembly\NativeImages1_v版本号\mscorlib\版本号__散列码\mscrolib.dll (3.07MB)
mscrolib.dll (1.88MB)还是一个IL码的版本,所以映射了一个native的版本的mscrolib.dll (3.07MB),来加快CLR的速度。
当IL的exe程序被双击执行时,OS Loader读入程序,识别出是IL,根据IL内部的引用定义,加载mscorlib.dll,而mscorlib.dll也是IL,内部引用C:\winnt\system32\mscoree.dll,于是再加载mscoree.dll,然后把控制权交给mscoree.dll,mscoree.dll接着加载mscrorsn.dll,mscrowsk.dll,mscrojit.dll,为了加快mscorlib.dll的调用,加载mscorlib.dll的native image版本,然后由mscorlib.dll接管控制权(不知道这两个mscorlib.dll是如何来上管IL,下连native code的?)最后寻找IL码程序的入口点Main函数,开始执行程序,在执行过程中,使用Class Loader动态加载一系列引用到的类,在当前路径下,在共享类库的GAC中查找等等。
这里和jvm.dll不同的一点是,jvm.dll加载的基础类库和加载其它类库方式完全一样,全部都是字节码的class。而mscrolib.dll加载以System名称开头的核心类库的时候,使用了“不正当竞争手法”。mscrolib.dll从GAC中加载共享核心类库之后,又C:\Winnt\assembly\nativeimages_.Net版本号\名称空间\ 目录下加载了核心类库的native版本,这样一来,自然CLR运行起来要快多了。特别是图形图像类库全部都有native映射版本,所以CLR上运行GUI焉能不快?
对比CLR和JRE的加载过程,比较不同的地方是mscorlib.dll和System核心类库都有一个native image,可能这是CLR运行速度比较快的一个主要原因吧。
分析完以后有一个特别明显的感受,Java的底层运行机制设计的特别简单,而.Net的底层运行机制设计的特别复杂。但是在企业层刚好相反,J2EE设计的特别复杂,而.Net却设计的特别简单,真是有意思!
Java的底层机制设计虽然简单,但是很健壮,.Net设计使得它的CLR速度快,类库管理功能强大,但是不是比Java更优秀,还要等以后慢慢看了。
发表评论
-
member系统
2013-08-05 16:18 0member 系统源码 -
hibernate generate tool
2012-09-06 11:33 0hibernate generate tool -
funcation spec and technical spec of vanceinfo
2012-08-02 11:21 0asdfasdf -
Web大数据量页面优化实践
2012-07-02 15:18 963pdf见附件 -
Eclipse Shortcuts
2012-02-29 16:31 889http://www.allapplabs.com/eclip ... -
协议的定制
2011-04-19 17:42 0哀伤的发生的发送方的 wireshark 截取发送消 ... -
uc面试
2011-04-14 18:03 0一、综合测试 1、有7 ... -
velocity输出csv的一种做法
2010-10-12 16:36 2398使用spring mvc + velocity做项目时, ... -
java平台启动脚本
2012-07-27 16:37 4151window平台java启动脚本 @e ... -
flex相关资料
2010-04-24 22:05 0http://www.adobe.com/devnet/fle ... -
开放平台的一些思考
2010-03-22 17:22 0开放平台开发人员编写rpc请求,还是直接进行服务代 ... -
web开发中的中文问题
2014-02-22 21:44 864web开发中的中文 ... -
Evaluation_strategy:java call by sharing赋值策略参数传递
2010-02-14 06:25 187关于java call by value or call by ... -
osgi的企业级开发的一些经验
2010-02-05 17:01 2118前面看了论坛里面关 ... -
spring 3.0 应用springmvc 构造RESTful URL 示例
2010-02-04 12:22 0转载自:http://niyong.iteye.com/blo ... -
声明式缓存,View层缓存讨论
2010-02-03 23:19 1126背景:由于理财专区二期的基金数据一天更新一次。并且都是非操作型 ... -
mysql guide
2010-01-31 17:07 0mysql最大能存多少 InnoDB存储引擎将Inno ... -
面试题系列一:exception未被捕获,但有finally,请问打印结果
2010-01-23 23:33 294看代码,猜结果: package jyy.exceti ... -
hello maven
2010-01-23 23:30 2411创建项目 mvn archetype:create - ... -
有趣的实验报告
2009-12-25 12:51 236淘宝一位同事上大学时 ...
相关推荐
标题中的“通过CLR连接C#和C++的简单模型”指的是使用.NET框架的公共语言运行时(Common Language Runtime,简称CLR)来实现C#和C++之间的互操作性。CLR是微软开发的一种运行环境,它允许不同编程语言编写的代码在...
在CLR中,内存管理有着独特的机制,特别是垃圾回收(Garbage Collection)功能,解决了传统C++等语言中常见的内存泄漏和内存碎片问题。 在传统的C++编程中,程序员需要手动分配和释放内存,而使用CLR,内存分配和...
2. **内存管理详解**:深入探讨CLR如何管理内存,包括堆栈和堆之间的区别、内存分配策略、垃圾回收机制等。 3. **性能优化技术**:提供一系列提高C#应用程序性能的方法和技巧,如使用异步编程模型、减少内存分配等。...
综上所述,《CLR via C#》第四版不仅是一本深入学习C#语言的技术书籍,更是了解和掌握.NET Framework核心机制的宝贵资料。无论是对于初学者还是有经验的开发者而言,本书都具有极高的参考价值。
标题中的“wpf,CLR运行时效率分析比较”涉及到的是Windows Presentation Foundation(WPF)框架与Common Language Runtime(CLR)在处理数据绑定和属性访问效率上的对比。在WPF中,DependencyProperty是一种特殊...
CLR是.NET Framework的核心,它是一个运行时环境,负责管理代码的执行,包括内存管理、类型安全、异常处理以及安全性等。它支持多种编程语言,使得开发者可以使用自己熟悉的语言(如C#、VB.NET、C++/CLI等)编写.NET...
CLR(Common Language Runtime)是.NET框架的核心组成部分,它为各种编程语言提供了运行环境,使得开发者可以用不同的语言编写代码,然后在CLR上统一运行。在这个"CLR项目开发文档.rar"中,我们可以期待找到关于如何...
CLR,即Common Language Runtime(公共语言运行时),是.NET Framework的核心组成部分之一,它为托管代码提供了一个执行环境,同时也提供了诸如内存管理、线程管理和安全性等服务。CLR确保了在.NET Framework下开发...
本书《CLR with C# 第三版》是关于 C# programming language 和 Common Language Runtime(CLR)的详细指南,旨在帮助读者深入理解 CLR 和 C# 的内部机制和实现细节,从而提高编程效率和代码质量。
4. **异常处理**:CLR提供了一套强大的异常处理机制,帮助开发者更好地控制程序运行过程中的错误情况。 5. **多线程支持**:CLR支持多线程编程,使开发者能够更容易地创建高性能的并发应用程序。 6. **安全性和保护*...
VS2017 是一款功能强大且广泛使用的集成开发环境(IDE),CLR(Common Language Runtime)是微软公司推出的一个公共语言运行库,用于提供一个中立于语言的平台,以便于开发人员使用不同的编程语言来编写应用程序。...
本篇文章将详细探讨如何在Java虚拟机(JVM)和.NET CLR运行时环境中进行集成,并通过具体的程序代码例子"JNITest"进行解释。 首先,Java Native Interface (JNI) 是Java平台的一部分,允许Java代码和其他语言写的...
其中,动态化的组件模型和丰富的元数据使得CLR能够支持各种.NET语言,并且通过JIT编译实现了跨平台的运行时泛型,极大地增强了程序的灵活性和可移植性。 ### 泛型与模板集成 C++/CLI特别之处在于它同时支持CLR泛型...
第4章Visual C++ 2010 CLR 文件和注册表操作 第5章Visual C++ 2010 CLR使用GDI+绘图 第6章Visual C++ 2010 CLR访问Internet 第7章Visual C++ 2010 CLR Windows服务 第8章Visual C++ 2010 CLR线程和同步 第9章Visual ...
CLR(Common Language Runtime)是微软.NET Framework的核心组成部分,它为.NET应用程序提供了运行环境。当我们在谈论"CLR Profile for 3.5"时,我们是指针对.NET Framework 3.5版本的CLR性能分析工具。这个工具主要...
- **安全控制**:CLR通过类型安全性检查、安全策略和代码访问安全机制确保代码的安全性。 #### 2. 托管代码与非托管代码 - **托管代码**:指那些运行在CLR之上的代码,这些代码由CLR进行管理,享有CLR提供的各种...
《框架设计 CLR via C#》是一本深入探讨.NET Framework核心组件——公共语言运行时(Common Language Runtime, CLR)的专业书籍,作者通过C#语言详细解析了CLR的工作原理和设计思想。这本书是理解.NET应用程序底层...
- **引用管理**:在C#项目中,正确地添加C++ CLR类库的引用,确保编译时和运行时能找到所需库。 - **异常处理**:由于C++和C#的异常处理机制不同,C++/CLI类应处理非托管代码可能抛出的异常,并转换为.NET可以理解的...