类加载器
各层级类加载器的关系
ClassLoader的继承树
类加载器的分类虚拟机自带的加载器
启动类加载器(引导类加载器 Bootstrap ClassLoader)
使用c/c++实现的,嵌套在JVM内部
用来加载Java的核心库,用于提供JVM自身需要的类
并不继承自java.lang.ClassLoader,没有父加载器
加载扩展类和应用程序类加载器,并指定为他们的父类加载器
只加载包名为java、javax、sun等开头的类
扩展类加载器(Extension ClassLoader)
Java编写,由sun.misc.Launcher$ExtClassLoader实现
派生于ClassLoader类
父类加载器为启动类加载器
从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。
应用程序类加载器(系统类加载器 AppClassLoader)
java编写,由sun.misc.Launcher$AppClassLoader实现
派生于 ...
双亲委派机制
引入
Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。
双亲委派机制工作原理
如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行
如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器
如果父类加载器可以完成加载任务,就成功返回,若不能完成则子加载器才会尝试自己加载
图示:
双亲委派机制优势
避免类的重复加载
保护程序安全,防止核心API被随意篡改
沙箱安全机制
在加载类的时候遇到用户自定义如java.lang包的类时,这个类会被委派到引导类加载器。引导类加载器会对此类进行校验,假如此类不是核心库中的类则会直接报错终止程序。这种安全校验就是沙箱安全机制,对jvm和程序起到了保护作用。
类的加载过程
类的加载过程类的加载有三大步 加载 链接 初始化
加载
通过类的全限定名获取定义此类的二进制字节流
将这个字节流所代表的的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
链接
验证(Verify)
目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全。
主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证。
准备(Prepare)
为类变量分配内存并且设置该变量的默认初始值,即零值。
这里不包括含用final修饰的static,因为final在编译的时候就会分配,准备阶段会显示初始化。
这里不会为实例变量分配初始化,变量会分配在方法区中,而实例变量是会随着对象一起分配到Java堆中。
解析(Resolve)
将常量池内的符号引用转换为直接引用的过程。
事实上,解析操作往往会伴随着JVM在执行完初始化之后再执行。
符号引用就是一组符号来描述所引用的目标。符号引用的字面量形式明确定义在《Java虚拟机规范》的 ...
多线程
多线程基础实现多线程的四种方式
继承Thread类
实现Runnable接口
实现Callable接口
使用线程池
常用方法
run(),start(),currentThread(),getName(),yield()(放弃cpu的当前执行权),wait(),notify()/notifyAll(),join()sleep(),isAlive(),stop()(已过时)
优先级
MAX_PRIORITY:10(Thread.MAX_PRIORITY)MIN_PRIORITY:1NORM_PRIORITY:5
线程的同步(线程的安全问题)
操作共享数据的代码,即为被同步的代码。
共享数据:多个线程抢夺的资源
同步监视器,俗称:锁。
Callable接口
实现类实现Callable接口
将实现类作为参数创建FutureTask
将FutureTask对象作为参数创建Thread并启动线程
代码:
1234567891011121314151617181920212223242526272829303132333435import java.util.concurrent. ...
搭建博客
环境github+hexo搭建个人博客
安装环境
安装nodejs
前往nodejs官网下载安装链接-http://nodejs.cn/download/
安装hexo
npm install -g hexo-cli(建议安装淘宝cnpm更快你懂的~)
创建博客文件夹
mkdir blog
如图:
初始化hexo
打开命令行进入创建好的blog命令行开始操作~hexo init
小操作
hexo n 博客标题:创建文章hexo clean | g(生成) | s(本地服务)
安装插件
npm install –save hexo-deployer-git
修改_config.yml文件
deploy:type: ‘git’repo: ‘https://github.com/Tab-Tan/Tab-tan.github.io.git'branch: ‘master’
远程部署
hexo d
我的第一篇博客
第一个博客也不知道说些什么 Java天下第一!
yeah~