1.什么是JVM
- JVM可以看作一个用C语言编写虚拟机软件(提供远行环境规范),运行的是JAVA(又名C+±-)程序
- JVM调优在方法区(Method Area)、堆(Heap)(99%)进行
三种JVM: - Sun公司的HotSpot
- BEA公司的Oracle JRockit
- IBM
2.JVM的位置
- 图示
3.JVM结构体系
- 图示
4.类加载器
- 作用:加载Class文件~(就是加载Java类到虚拟机里面)new polarBear();创建一个实例他的名字放在栈(Stack)里面,具体的对象放在堆(Heap)里面
- 不同的类加载器负责不同的区域类的加载
1.启动类(根)加载器(Bootstrap ClassLoader):这个加载器不是一Java类,底层由C语言实现,因此启动类加载器不属于Java类库无法直接被Java程序直接引用。
2.扩展类加载器(ExtClassLoader):开发者可以直接使用
3.应用程序加载器(AppClassLoader):也叫系统类加载器,负责加载用户类路径上所制定的类库,可直接使用
5.双亲委派机制
- 为什么使用该机制:为了保证Java核心库的类型安全,通过该机制对于Java核心库的类加载工作由启动类加载器来统一完成,保证了Java应用所使用的都是同一版本的Java核心库得类,是互相兼容的
- 加载过程:
1.类加载器收到类加载的请求
2.将这个请求向上委托给父类加载器去完成,一直向上委托,直到启动类加载器
3.启动加载器检查是否能够加载当前这个类,能够加载就结束并使用当前的加载器,否则抛出异常并通知加载器进行加载
4.重复步骤 3
6.沙箱安全机制
- 相关介绍:我们都知道,当你编写一个Java程序,默认是访问该机器的任意资源,比如读取、删除一些文件或者网络操作。当你把程序正式部署到正式的服务器上,系统管理员要为服务器的安全承担责任,那么他可能不确定你的程序会不会访问不该访问的资源,为了消除潜在的安全隐患,有两种方法:
1.让你的程序在一个限定得账号下运行
2.利用Java得沙箱机制来限定你的程序不能肆意访问 - 什么是沙箱机制:在Java中将执行程序分为本地代码和远程代码两种,本地代码默认视为可信,而远程代码则被视为是不受信的。对于授信的本地代码可以访问本地一切资源。而对于非授信的远程代码在早期Java实现中安全依赖于沙箱机制。但如此安全的机制也给程序的扩展功能带来了障碍,当用户希望远程代码访问本地资源时无法实现。
- 改进:因此针对该问题Java1.1进行了改进,增加了安全策略,允许用户指定代码访问本地资源。在Java1.2中再次进行改进安全机制,增加了代码签名,不论是本地代码还是远程代码都会按照用户的安全策略设定,由类加载器加载到虚拟机中不同权限的运行空间,来实现差异化的代码执行权限控制
- 什么是域:当前最新的安全机制引入了域(Domain)的概念。虚拟机会把所有代码加载到不同的系统域和应用域。系统域部分专门负责与关键资源进行交互,而应用域则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的保护域对应不一样的权限。存在不同区域的类文件就具有了当前域的权限
- 组成沙箱的组件:
1.字节码校验器(bytecode verifier):确保Java类文件遵循Java语言规范,实现内存保护,但并不是所有类的文件都会经过字节码校验,比如核心类
2.类加载器:类装载器采用双亲委派机制,其中类装载器在三个方面对Java沙箱器作用:
1.它防止恶意代码去干涉善意代码
2.它保护了被信任的类库边界
3.它将代码归入保护域,确定了代码可以进行那些操作
7.Native关键字
- 凡事带Native关键字的方法说明Java的作用范围达不到了,回去调用底层C语言的库
- 会进入本地方法栈调用本地方法库
- 调用本地方法接口 JNI(扩展Java得使用,配合不同语言的编程语言(C、C++)为Java所用),调用C、C++的程序
- 他在内存区域中专门开辟了一个标记区域:Native Method Stack,登记native方法
- 在最终执行的时候加载本地方法库的方法通过JNI
8.栈
- 先进后出,后进先出
- 因为栈的进出规则,所以main方法先执行最后结束
- 线程结束栈内存释放(不存在垃圾回收)
- 栈里存放八种基本数据类型、对象引用(名称)、实例方法
- 栈运行原理:栈帧,每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口信息,每一个方法从调用直至执行完毕的过程,就对应着一个栈从进栈到出栈的过程
9.HotSpot
- HotSpot是一款高性能的Java虚拟机,可以大大提高Java运行的性能
- 我已写了一个专门讲述HotSpot的专题博客(我的HotSpot专题博客)