JVM内存分布
方法区:包含类数据,方法数据
堆区:包含对象
Java栈:包含线程的临时数据。当线程运行的时候,每个java方法都有自己的栈桢。里面包含每个Java调用时的状态
局部变量区,通过索引访问
操作数区,通过出栈入入栈访问
帆数据区 :用来支持常量池解析,正常方法返回及异常派发处理,
永远都不会在局部变量区及操作数区发现对象的拷贝,只会发现对象的引用
PC寄存器
本地方法区:包含本地方法
JVM类的装载系统
启动类加载器
扩展类加载器
自定义类加载器
类对于每个class字节码都有四次的验证:
第一次检查头文件是否正确 Class文件结构检查
第二次检查语法是否规范 类型数据的语义检查
第三次检查语法定义的类是否存在 字节码检查:确保操作数栈中总是包含正确的数值及正确的类型,它必须保证局部变量在赋予合适的值前不能够被访问,而且类的字段中总
是被赋予正确的类型值。类的方法被调用时总是传递正确的数值及类型的参数 .此次检查并不能够检查出所有的问题,如果尝试这么做,则会碰到"停机问题":不可能写出一个程序,用它
来判断作为其输入而读入的某个程序在执行时是否会停机。一个程序是否会停机被认为是程序的不可预测特征
第四次检查所引用的对象是否在内容存在:符号引用的验证
1.装载:查找并装载类型的二进制数据
2.连接:执行验证,确保被导入的数据的准确性 准备:为类变量分配内存,并初始化为默认值,解析:把类型中的符合转换为直接引用
3.初始化:把类变量初始化为正确的初始值
二进制兼容:
对于两个类,一个类引用到另外一个类的方法。如果只是方法的内部改变了。。则此类不会重新编译。如果是方法的接口改变了。则会引用重新编译
JVM沙箱实现:
1。对于一个类的加载过程,类加载器先从自己的父亲加载器中获取,以此循环直到最底层的启动类加载器。如果父亲类加载器返回为空。则在自身中尝试加载寻找。
不同层次的类加载器所加载的类对应有不同的权限。
2。又有。对于一个类加载成功后。都有多个策略文件以确定此类可以得到的权限.
3.
对于的MS的ActiveX的策略是要么全部通过,要么全部不通过。
同样还没有解决的问题:
不断分配内存直至内存耗尽
不断生成线程导致每个事件处理都很慢 DOS
JINI:
查找服务组