Jvm运行时的数据区域
PC register(程序计数器)
所执行编码的行号指示器,指到哪一行既执行哪一行的代码,线程私有的
方法区 :
- 存放类的信息
- 常量
- 变量
- 线程共享
- JIT编译器编译后的代码数据
什么是JIT 即时编译器(Just in time)?简单来说,Java程序最初是通过解释器翻译字节码(.class),然后在把它们编译成相应的机器码来运行。后来发现有一些代码会执行很多次(称为Hot spot code 热点代码),于是乎把这个代码直接编译成机器码来加快运行速度,完成这个任务的既为即时编译器。
- 又叫“永久区”,被GC覆盖
- -XX:MaxPermSize?M:调整内存最大值
- 运行时常量池
用于存放编译期生成的各种字面量和符号引用;
动态性:运行期间可将新的常量放入池中,如String.intern();
- OutOfMemoryError
java虚拟机栈:
- 存放方法栈,基本单位 栈帧,一个栈帧对应一个方法
- 栈帧里存放:局部变量(int,long,float,double,char,boolean,byte,short 和 reference(对象引用)),操作数栈,方法出口,动态链接
在java中,一个java类将会编译成一个class文件。在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类
的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。
- 线程私有
- 如果线程请求的栈深度找过虚拟机允许的深度,会报StackOverFloorError
- 动态扩展时无法申请到足够的内存,会报OutOfMemoryError
- -Xss:调整栈的最大深度(分配给栈的内存)
引用块内容
java堆:
- 存放对象实例
- 线程共享
- GC的主要区域
- 内存不够时会报OutOfMemoryError
- -Xmx?M分配给堆的最大内存,-Xms?M分配给堆的最小内存
本地方法栈
存放native的方法,和虚拟机栈差不多。