java内存模型笔记(一)

最近刚刚看了《深入java虚拟机》的前几张,趁着还有点印象,还是先写下来。

第一章:java的体系机构

       java的设计之初就是了方便地从网络上获取编译好的.class文件,使用本地的java虚拟机执行程序。java的跨平台运行就是利用了这个特性,《java虚拟机规范》规定了所有虚拟机编译后必须按规范产生.class,这就保证了编译java的虚拟机和执行.class文件的虚拟机实现方式不同也能执行相同的程序。所谓的跨平台,我的理解是.java文件和.class文件可以被跨平台地编译和执行,但java虚拟机并不能跨平台。java虚拟机需要根据主机和操作环境的不同而有不同的实现,这就跟c和c++为指定的操作系统编写特定的编译器一样,所以java跨平台还有是它的局限性。

     大家都知道,运行java程序都需要指定环境变量中的classpath,一般指向的都是当前类路径和jdk的路径。java中加载.class文件采用双亲委托加载模式,即先加载jdk源码中的class文件,再加载当前类路径中的class文件,最后才是classloader指定的class文件。

     什么是classloader? java为了确保每个类拥有各自独立的命名空间,除了类名和包路径外还隐式地包含了classloader对象名,只有三者完全一致才能判断两个类相同。一般的程序都无需手动指定classloader,所以默认都采用系统提供的classloader,所以我们看到的类对象基本都是同一个。

     正是应该有了classloader,所以我们能从网络上获取.class文件进行加载。classloader还有一些经常被我们使用到场景,但我们往往都感觉不到。比如tomcat的webapp目录下有多个工程,怎么能确保每个工程的命名空间项目独立呢,正是由于classloader发挥了关键的作用,使得多个工程同时运行时也不会发生相互干扰。

猜你喜欢

转载自luzhecheng.iteye.com/blog/1109174