《深入Java虚拟机第二版》读书笔记

来源:互联网 发布:韩子高网络剧 编辑:程序博客网 时间:2024/06/06 12:25

1.Java 虚拟机的主要任务是装载class文件并且执行其中的字节码。Java虚拟机包含一个 类装载器,它可以从程序API中装载class文件。Java API只有程序执行时需要哪些类才会被装载。字节码由执行引擎执行。

2.Java中有两种方法:本地方法和Java方法。Java方法由Java编写,编译成字节码,储存在class文件中。本地方法由其他语言编写,编译成和处理器相关的机器代码。本地方法保存在动态链接库中。

3.Java程序可以使用两种装载器,启动装载器和用户自定义装载器。有了用户自定义装载器,不必在编译时知道运行中java程序最终会加入的所有类,运行时用到哪些类再加载。

4.Java class文件是可以运行在任何支持Java虚拟机的硬件平台和操作系统上的二进制文件。

5.Java避免无意间破坏内存的一个办法是垃圾自动收集。在Java中,停止对一个对象的引用,一段时间后,垃圾收集器会自动回收这个对象所占用的内存。

6.平台无关性:选择足够好的java平台版本,在该版本上编写运行Java程序。编写程序只通过Java API标准运行库访问计算机(不要调用本地方法,或者开发商那些调用本地方法的库)

7.Java安全模型侧重于保护终端客户免收从网络下载来自不可靠的恶意程序的侵犯。为此,Java提供了用户可配置的“沙箱”。沙箱模型使你可以接受来自任何来源的代码,当不可靠代码运行时,沙箱限制它进行破坏系统的任何动作。

8.组成沙箱的基本组件:类装载器,class文件检验器,内置于java虚拟机的安全特性,安全管理器及java api,其中类装载器和安全管理器用户可自己定制。

9.class文件校验器保证装载的class文件内容有正确的内部结构,并且与class文件之间互相协调一致。

10.Java虚拟机装载一个类,并且对它进行前三趟class文件检验,这些字节码就可以运行了。

11.Java虚拟机内置的安全特性:1)类型安全的引用转换,结构化的内存访问,自动垃圾收集,数组边界检查,空引用检查。2)并未指明运行时数据空间在java虚拟机内部是怎么分布的。

12.安全管理器保护虚拟机的外部资源不被虚拟机内运行得恶意或者有漏洞的代码侵犯。

13.当Java虚拟机运行一个程序时,它需要内存来储存很多东西。如,字节码,从已装载的class文件中得到其他信息,程序创建对象,传递给方法的参数,返回值,局部变量等。Java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。

14.每个Java虚拟机实例都有一个方法区和堆,它们是由该虚拟机所有线程所共享的。每当一个线程被创建的时候,它都得到自己的PC寄存器和Java栈。Java栈总是储存该线程中的Java方法调用状态等等。

15.Java栈是许多栈帧组成的,一个栈包含一个一个Java方法的调用状态,当线程调用一个Java方法时,虚拟机压入一个新的 栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从java栈中弹出并抛弃。

16.不同类加载器装载的类将被放在虚拟机内部的不同命名空间中。

17.常量池:虚拟机必须为每个被装载的 类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string,integer等)和对其他类型,字段和方法的符号引用。池中数据项就像数组一样通过索引访问。

18.Java程序在运行时创建的所有类实例或数组都放在同一个堆中。而一个Java虚拟机中只有一个堆空间,因此所有线程都将共享这个堆。

19.当某个线程调用一个本地方法时,它就进入了一个全新的不再受虚拟机限制的世界。本地方法可以通过调用本地方法接口来访问虚拟机的运行时数据区。

20.java class文件包含Java 虚拟机所需要的所有信息,具体变量,方法等信息存在对应的表内。

21.类型的声明周期:类型装载,链接与初始化。装载就是将二进制形式的文件读入java虚拟机中,连接就是把这种已经读入java虚拟机的二进制形式的类型数据合并到虚拟机运行时状态中去。连接分三个步骤:验证、准备、解析。

22.同对象一样,虚拟机装载连接并初始化类,使程序能够使用类,当程序不在引用它们的时候可选地卸载它们。

23.class文件把它所有引用符号保存在常量池。每一个class文件都有一个常量池,每一个被Java虚拟机装载的类或者接口都有一份内部版本的常量池,称作运行时常量池。Java虚拟机为每一个装载的类和接口保存一份独立的常量池。

24.双亲委派模型和类装载器:从JDK1.2开始,java虚拟机规范推荐开发者使用双亲委派模式(ParentsDelegation Model)进行类加载,其加载过程如下:(1).如果一个类加载器收到了类加载请求,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器去完成。(2).每一层的类加载器都把类加载请求委派给父类加载器,直到所有的类加载请求都应该传递给顶层的启动类加载器。(3).如果顶层的启动类加载器无法完成加载请求,子类加载器尝试去加载,如果连最初发起类加载请求的类加载器也无法完成加载请求时,将会抛出ClassNotFoundException,而不再调用其子类加载器去进行类加载。双亲委派 模式的类加载机制的优点是java类它的类加载器一起具备了一种带优先级的层次关系,越是基础的类,越是被上层的类加载器进行加载,保证了java程序的稳定运行。双亲委派模式的实现:

25.垃圾检测通常通过建立一个根对象的集合并且检查这些根对象开始的可触及性。如果正在执行的程序可以访问到根对象和某个对象之间存在引用路径,这就是可触及的。

26.区分活动对象和垃圾的两个基本方法是 引用计数和跟踪。引用计数垃圾收集器通过为堆中每个对象保存一个计数来区分活动对象和垃圾对象。这个计数记录下那个对象的引用次数。跟踪垃圾收集器追踪从根节点开始的引用图。追踪过程中打上某种标记,当追踪结束时,没有打上标记的对象就被判定是不可触及的 ,当做垃圾回收。

27.压缩收集器:对付堆碎块。 拷贝收集器:把活动对象移动到新的区域。 自适应收集器:自动调整更好的垃圾收集技术。

0 0
原创粉丝点击