1.java virtual machine 管理的内存区域(5个)
java运行时数据区
程序计数区
当前线程所执行的字节码的行号指示器;
每个线程均有一个PC,并且互相独立,互不影响。
执行java方法(Java字节码)时,pc内容就是正在执行的字节码地址;
执行native方法时,pc内容为空
异常:OutOfMemoryError
java虚拟机栈
用于存储局部变量表,操作栈,动态链接,方法出口等信息。
方法的调用至完成的过程就对应着栈的push和pop过程。
局部变量表用于存放编译时期可知的基本数据类型和引用类型(不是对象本身,是一个与该对象有关的地址,如指针或句柄),以及returnAddress类型。局部变量表在编译期完成分配,运行时不会改变。
异常:StackOverflowError ,OutOfMemoryError
本地方法栈
与虚拟机栈相似,区别在于虚拟机栈为jvm执行Java方法服务,本地方法栈为jvm执行native方法服务。
异常:StackOverflowError ,OutOfMemoryError
堆(heap)
jvm管理的最大的一块区域;
jvm启动时就创建,被所有线程所共享;
用于存放对象实例,即所有对象创建时都是在堆中创建的;
是GC负责的主要区域;
物理上可以不连续,逻辑上连续即可。
OutOfMemoryError,在堆上没有完成实例的创建,以及堆无法再扩展时。
方法区 (method area)
各个线程所共享的内存区域;
存储已被虚拟机加载的类信息,常量,静态常量,即时编译后的代码等数据;
jvm规范将MA描述为Heap的一个逻辑部分,但其有一个别名:non-heap 以便与heap区分。
内存可以不连续,大小可扩展,可以选择不实现垃圾收集,GC在MA中主要是针对常量池的回收;
异常:OutOfMemoryError
运行时常量池(runtime constant pool ,rsp)
方法区一部分;
常量池用于存放编译器生成的各种字符常量和符号引用,但在类加载后,将这些信息存放到MA中的RCP中。
与常量池相比,RCP具有动态特性,即可以在运行时将新的常量放入RCP中。如String中的intern()方法;