三:JVM(重点)
Posted bookmiki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三:JVM(重点)相关的知识,希望对你有一定的参考价值。
1.类加载器(将字节码文加加载到方法区 这里有一个验证的过程,错误的class将会被jvm吐出)重点
1.1 虚拟机加载器
启动类加载器:Bootstrap 通过getClassLoder获得的是Null。例如object类和String类的类加载器就是null因为权限不够
扩展类加载器:extension javax开头的包就是扩展的加载器的包
应用程序类加载器:Appclassloder 自己写的类的加载器。java也叫系统类加载器,加载当前应用的classpath的所有类
1.2 用户自定义加载器
Java.lang.classloader的子类用户可以定制类的加载方式。
1.3 沙箱安全机制:
1.先去启动类里面找,找的到就用,找不到就去扩展类加载器中去用,如果还是找不到就去应用程序类加载器中去用:例如下面会包错找不到main方法
1.4双亲委派机制:
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一一个好处是比如加载位于rt,jar包中的类java.lang.Object, 不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这 样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。
2.执行引擎执行
3.本地接口(重点)native只有声明没有实现 因为实现不在JAVA中而在第三方(底层)
本地方法接口native interface:用native标注的方法就已经超出了JAVA的管辖范围就要等待C或者底层第三方函数库去实现
本地方法加载到本地方法栈中
4.PC寄存器:程序计数器(就相当于程序运行顺序表每个各自存着下一条代码的内存地址。)
记录了方法之间的调用和执行情况,类似排班值日表,用来存储指向下一条指令的地址,也即将要执行的指令代码,他是当前线程所执行的字节码的行号指示器
5.方法区:
5.1 他存储了每一个类的结构信息(模板)
5.2 方法区是规范,在不同的虚拟机里头实现是不一样的。最典型的就是永久代(PermGen Space)和元空间(Metaspace)个人猜测:Static就应该是在方法区中的吧
以上是关于三:JVM(重点)的主要内容,如果未能解决你的问题,请参考以下文章