0%

类加载器分类

有三种默认使用的类加载器,分别是Bootstrap ClassLoader、Extension ClassLoader和System ClassLoader(也称为Application ClassLoader),除此之外还可以自定义类加载器,每种类加载器已经确定从哪个位置加载类文件。

Bootstrap ClassLoader引导类加载器

Bootstrap ClassLoader是由C/C++来编写的,负责加载JDK自带的lib目录下如rt.jar包中(名字不符合的类库即使放在lib目录下也不会被加载)的类文件以及sun.boot.class.path路径下的内容,是所有的类加载器的父加载器,并没有继承ClassLoader类

Extension ClassLoader扩展类加载器

Extension ClassLoader是由java语言编写的,sun.misc.Launcher.ExtClassLoader实现,继承了ClassLoader类,负责加载Java扩展类库,从lib/ext目录下或者java.ext.dirs系统属性指定的目录下加载类,父类加载器是Bootstrap ClassLoader

Application ClassLoader系统类加载器

Application ClassLoader是由java语言编写的,sun.misc.Launcher.AppClassLoader实现,继承了ClassLoader类,负责从classpath环境变量中加载类文件,classpath环境变量通常由”-classpath”或”-cp”命令行选项来定义,或是由JAR中Mainifest文件的classpath属性指定,父加载器是Extension ClassLoader,该加载器是程序默认的加载器,一般情况下,java中的类都是由该加载器加载的

阅读全文 »

类加载机制

源代码经过编译器编译之后生成了一个字节码文件(class文件),字节码文件中存储的是jvm指令,而不是机器指令

Java虚拟机的启动是通过引导类加载器创建一个初始类来完成的,这个类由虚拟机的具体实现指定,Java虚拟机链接这个初始类,初始化并调用它的main方法,之后整个执行过程都是由对此方法的调用开始。执行main方法中的java虚拟机指令可能会导致Java虚拟机链接另外一些类或接口,也可能会调用另外的方法

类加载器子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识,class字节码文件在类装载器子系统(Class Loader SubSystem)中有三个阶段

  • 第一阶段:加载 找到class文件并把这个文件包含的字节码加载到内存
  • 第二阶段:链接 链接中包含 字节码验证、准备和解析
  • 第三阶段:初始化,类中的静态属性和初始化赋值以及静态块的执行等

加载、验证、准备、初始化这几个阶段是确定的,但是解析阶段则不一定,在某些情况下可以在初始化之后再开始,为了支持java语言的运行时绑定特性(动态绑定或晚期绑定)。

加载阶段

加载阶段是根据特定名称查找类或接口类型的二进制表示,将java字节码数据从不同的数据源加载到JVM中

ClassLoader只负责class文件的加载(使用到该类时才会加载),将java类的字节码文件加载到机器内存,是否可以运行是由Execution Engine决定,加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息(包括字符串字面量和数字常量,是class文件中常量池部分的内存映射)

阅读全文 »

JVM生命周期

JVM的生命周期分为启动、执行和退出

JVM启动

JVM启动是通过引导类加载器(bootstrap class loader)创建一个初始类来完成的,这个类是由虚拟机的具体实现指定的

JVM执行

java虚拟机的任务就是执行java程序,程序执行时运行,程序结束时停止,在执行程序时实际上执行的是java虚拟机进程

JVM退出

JVM退出会有以下几种情况

  • 程序正常执行结束
  • 程序在执行过程中遇到了异常或错误而异常终止
  • 由于操作系统出现错误导致java虚拟机进程终止
  • 某线程调用Runtime类或System类的exit方法,或Runtime类的halt方法,并且java安全管理器也允许这次exit或halt操作
  • JNI(Java Native Interface)规范描述了用JNI Invocation API来加载或卸载java虚拟机时,java虚拟机的退出情况

Git修改提交信息

有时候打字打得太快导致提交信息写错了,但是回车键已经按下去了,这时候提交信息如何修改呢

  • 首先查看所要修改的提交信息的commit是倒数第几次提交的,使用git log查看提交记录

    1
    git log

Git修改提交信息第一步

  • 我要改的是倒数第一条的提交信息,然后我要退回到倒数第n次的状态,使用git rebase进行回退,将对应的提交前面的pick改成edit,然后进行保存

    1
    git rebase -i HEAD~1
  • 执行git commit —amend后生成的commit是一个全新的commit,之前老的commit会从项目历史中被删除

    1
    git commit --amend
  • 执行git rebase —continue

    1
    git rebase --continue
  • 最后执行git push

阅读全文 »

linux中的file对象

文件对象表示进程已打开的文件,该对象file(不是物理文件)由相应的open()系统调用创建,由close()系统调用销毁,因为多个进程可以同时打开和操作一个文件,所以同一个文件也可能存在多个对应的文件对象。文件对象仅仅在进程观点上代表已打开文件,它反过来指向目录项对象(反过来指向索引节点),其实只有目录项对象才表示已打开的实际文件,虽然一个文件对应的文件对象不是是唯一的,但对应的索引节点和目录项对象无疑是唯一的,另外类似于目录项对象,文件对象实际上没有对应的磁盘数据