深入java虚拟机

时间:2022-04-10 09:32:44

以下内容均来自:深入Java虚拟机(原书第二版清晰版),感觉这本书讲的很不错,做个笔记。

 

1 为什么要使用java?

   因为人们生活现在越来越离不开网路,java是为网络而设计。并且java能保证安全的,健壮的且和平台无关的程序通过网络传播,能在很多不同的计算机和设备上运行。

2 java的体系结构。

   java程序设计语言、java class文件格式、java api(编程接口)、java虚拟机

   通过java编程语言编写java代码,然后编译成java class文件,在java虚拟机中运行class文件。

 在编写java程序时,通过调用java api来访问系统资源。

3 java 虚拟机。

   java的面向网络的核心就是java虚拟机。它支持java面向网络体系结构的三大支柱的所有方面:平台无关性、安全性、网络移动性。

4 类装载器classloader 执行引擎

   classloader装载class文件(程序文件/api),然后执行时由执行引擎来完成。

   执行引擎:最简单的一次性解释字节码、更快的但更消耗内存的即时编译器

5 java与主机交互。

   java中有两种方法:java方法和本地方法,java方法是java语言编译成字节码文件,与平台无关;本地方法是native方法,这种方法是由其他语言(c、c++、汇编等)编写,编译成与处理器相关的机器代码,保存在动态链接库,格式是各个平台专有的。当java程序调用native方法时,虚拟机装载包含本地方法的动态库并调用方法。本地方法是联系java程序和底层主机操作系统的连接方法。

6 类装载器种类

   java中有启动类装载器,标准扩展类装载器,类路径类装载器,用户定义的类装载器。

   当每一个类被装载的时候,java虚拟机都监视这个类,被装载类中引用其他类时都会被相同的类装载器来装载。

   注:被装载的类只能看到由同一个装载器装载的别的类。被不同的类装载器装载的类放在不同的命名空间中,他们互相不能访问,除非应用程序显示允许。

7 安全性

   java的安全模型使它成为适于网络环境的技术,因为网络提供了一条攻击链接的计算机的潜在途径,因此安全性是非常重要的。如:applet需要通过网络下载到本地运行,这样文件被自动下载时很有可能用户会遇到来自不可靠来源的applet。jini服务对象的服务是从服务商的代码库下载的,这样jini的客户机很有可能会遇到来自不可靠来源的服务对象。

8 java 安全实现--沙箱

  组件:类装载器结构,class文件检验器,内置于java虚拟机的安全特性,安全管理器及java api。

  a 类装载器:第一道防线,毕竟代码是由类装载器将代码(这个代码可能是有漏洞的)装入java虚拟机。

     由不同的类装载器装入的类提供不同的命令空间来实现,每一个被装载的类有一个名字这个命名由虚拟机为每一个类装载器维护的。

     在同一个命名空间中的类可以直接进行交互,而不同命名空间中的类不能擦觉彼此的存在,除非显示地提供允许它们进行交互的机制。

     一个类装载器对应一个命名空间,不同命名空间中的类不能直接进行交互。所以不同classloader装载的类不能直接进行交互。

    类装载器装载使用双亲委派机制。装载类时先由双亲加载器装载,直到启动类装载器如果均不能加载成功,则由自己装载。(例子:有个病毒调用了hashmap类,想改变hashmap结构,这时使用双亲委派机制优先使用bootstrap装载,由于装载到了即返回这个类,不会使用别人改写后的。)

这种类装载体系可以防止不可靠的代码用她们自己的版本来替代可信任的类。

  b class文件检测器

     第一趟:class文件的结构检查。检查是否是规范的字节码文件;

     第二趟:类型数据的语义检查。主要检查一些编译时的强制规则:像final 方法有没被子化,有没被覆盖,常量池的索引必须指向正确的常量池条目。

                 看文件是否被有漏洞的虚拟机编译的。

     第三趟:字节码验证。是否能安全的被虚拟机执行。

     第四趟:符号引用的验证。

9 java 安全实现-内置的安全特性

   类型安全的引用转换、结构化的内存访问、自动垃圾手机、数组便捷检查、空引用检查。

   class代码中并没有内存地址,虚拟机装载class文件时来决定将这些字节码以及其他葱class文件中解析得到的数据放置在内存的什么地方。

   虚拟机启动一个线程时,有他来决定线程放在那个栈。

10 java虚拟机

    java虚拟机包括:类装载器,运行时的数据区,执行引擎。

    类装载器装载字节码文件,装载时会对字节码文件进行验证。然后装载后由执行引擎进行运行,运行时就需要内存来保存数据,如:class文件中得到的信息,程序创建的对象,传递给方法的参数,返回值,局部变量,以及运算中的结果等。这些数据都放在运行时的数据区便于统一管理。

    运行时的数据区包括:方法区,堆,java栈,pc寄存器,本地方法栈。

    深入java虚拟机

每个java虚拟机实例都有一个方法区和堆,它们是由该虚拟机实例中所有线程所共享的。

当虚拟机装载一个class文件时,他会将这个class文件中包含的二进制信息中解析类型信息,然后将信息放入方法区中;当程序运行时,虚拟机会把程序在运行时创建的对象放到堆中。

深入java虚拟机

 

java栈是由许多栈帧组成的,每个栈帧中包含每个java方法的调用状态。

深入java虚拟机

11 一个例子:

  深入java虚拟机

深入java虚拟机

深入java虚拟机

深入java虚拟机