jvm初步理解
1.jvm的位置
操作系统之上
2.jvm的体系结构
类加载器
负责class的加载,将class文件的字节码存入内存,并将这些内容转化成运行时方法区的数据结构,classloader只负责类的加载
.class文件由.java编译而来,存在本地磁盘
classLoader:加载本初始.class文件,得到真正的class类,就是模板
Car Class:当前类模板,存在方法区中
car1:实例对象,可以有多个,模板只有1个
类加载器的种类
根加载器:又c++编写,程序自带的类,如String,在Javahome/jre/lib/rt.jar中
扩展加载器:带javax的都是扩展包,在javahome/jre/lib/ext/*.jar
应用程序加载器:java.lang.classloaderd的子类,用户如果有需求可以自定义类加载器的加载方法
加载机制,根加载器->扩展加载器->应用程序加载器
类的双亲委派机制
当类加载器收到类加载请求时,不会立刻加载类,而是向父类加载器传递,如果父类还有父类。就继续向上传递,到最上的加载器,如果能加载就加载,不能加载再向下,父类无法加载,子类才会去尝试加载
类加载器的沙箱安全机制
沙箱内操作与本机无关,保证本机的安全性
Native
关键字,当有这个关键字时候,说明已经超过java使用范围,调用底层的c语言进行操作,会在本地方法栈登记,java刚出的时候,c和c++横行,想要发展得融合不同的编程语言
程序计数器
记录了方法之间的调用和执行情况,用于存储下一条指令地址;
每个线程都有一个私有程序计数器,就是一个指针,指向方法区的方法字节码,由执行引擎获取下一条指令,计数器的内存很小,几乎可以忽略不计
方法区
存储static,final,class模板,产量池
栈
栈管运行,堆管储存
栈也叫栈内存,主管java程序的运行,是在线程创建时创建,它的生命周期是跟着线程的生命周期的,线程结束栈内存也跟着释放,不存在垃圾回收问题,是线程私有,存有8种基本类型,对象的引用变量,实例方法都是在函数的栈内存分配;
存储本地变量,栈操作,栈帧数据
运行原理,方法调用压入栈,执行完毕弹出栈
Eden区满了后,触发轻GC,未被清除的进入幸存区,幸存区满了后,触发重GC,幸存的进入养老区
永久存储区存放的JDK自带的class对象,interface源数据,这个区域不存在垃圾回收,虚拟机关闭自动释放
栈,堆,方法区的关系