jvm入门(1)
1.0 jvm的基本架构
一、jvm 一共约有9个区域
- 类加载器
- 方法区
- java堆
- java栈
- 本地方法栈
- pc寄存器
- 直接内存
- gc
- 执行引擎
二、简单说明
1.0 类加载器
负责加载本地或者网络上的class文件信息,加载后的信息存放在名字叫方法区的内存空间
2.0 方法区
就是存放类信息、常量信息、常量池信息、包括字符串字面量和数字常量等
3.0 java堆
java堆主要用来存储数据 怎么放?放在哪?
java堆在jvm启动时自动创建,堆空间是所有线程共享的,主要存储对象的实例,是java程序的主要工作区域
4.0 java栈
栈解决程序的运行问题,即程序如何执行
主要保存 局部变量 方法参数,返回值,方法调用,对象的引用
5.0 本地方法栈
同java栈的作用差不多,只不过他是调用本地的方法,而不是java的
6.0 pc寄存器
如果系统调用本地方法 PC寄存器值为undefined,寄存器存放如当前执行环境指针、程序计数器、操作栈指针、计算的变量指针等信息。
如果不是本地方法 我的理解就是存储将要执行的下一条指令
7.0 直接内存
Java的NIO库允许java程序使用直接内存,从而提高性能
8.0 垃圾回收器 (gc)
java有一套自己进行垃圾清理的机制,开发人员无需手工清理
9.0 执行引擎
它负责执行虚拟机的字节码。一般会先进行编译成机器码后执行。
三、java堆 java栈 方法区的联系
堆是怎么存,栈是怎么执行,方法区记录堆栈信息的产生,是先决条件
eg:
A a = new A();
new A(); 实例化了A这个类 他就存放在堆中,a是这个实例的引用,存放在栈中
A这个类的信息 修饰符啊 是类还是接口啊 全限定名啊 都方法方法区
再谈java堆
java程序和java堆密切相关,几乎所有的对象都存在java堆中,java堆中的垃圾对象会自动被清理
根据回收机智的不同,可以分为新生代和老年代
新生代有可分为eden s0 s1 s0,s1区也被叫做from,to 区 然后才是老年代tenured
在一次新生代回收后,如果对象还存活,则会进入s0或者s1区,之后每经过一次新生代回收,如果对象存活则它的年龄就加1,当对象达到一定的年龄后,则进入老年代。
再谈java栈
java栈是一块线程私有的内存空间,一个栈,一般由三部分组成:局部变量表、操作数栈和帧数据区。
局部变量表:
操作数表 主要存储计算过程中的中间变量
帧数据区 栈还需要一些数据来支持常量池的解析,这里帧数据区保存着访问常量池的指针,方便程序访问常量池,另外,当函数返回或者出现异常时,虚拟机必须有一个异常处理表,方便发送异常的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。
再谈方法区
同堆一样,是所有线程共享的,保存了所有类的信息,如果类过多,就会抛出虚拟机内存溢出错误