Java内存结构是指Java运行时数据区,包括方法区、堆、Java虚拟机栈、本地方法栈、程序计数器,如下图
timg.jpeg
1.方法区
方法区对所有线程共享,存放被虚拟机加载的类的类信息、运行时常量池、静态常量和即时编译后代码等.
异常:当方法区无法申请足够的内存时会抛出OUtOfMemoryException
运行时常量池:编译生成的Class除了类信息外还包括运行时常量池,存放的是符号引用和字面量,在类加载后这些会存放到运行时常量池.
2.堆
Java堆对所有线程共享,存放的是对象实例,这些实例由垃圾回收器不定时回收.Java堆的容量可以是固定的也可以是动态扩展的.
异常:当堆无法为实例分配足够内存或动态扩展时无法申请到足够内存时会抛出OutOfMemoryException
3.Java虚拟机栈
我们平时说的栈内存就是Java虚拟机栈,每一个Java线程都用一个私有的Java虚拟机栈用来存放线程调用方法的状态,Java虚拟机栈由栈帧组成,每一个栈帧存放的是方法的局部变量表,操作栈数,动态链接和方法返回地址等.当线程调用一个方法时,会向虚拟机栈压入一个栈帧,直到方法结束栈帧从栈中弹出.
异常:当线程申请的栈容量超过虚拟机允许的最大值会抛出stackoverflowerror,当创建Java虚拟机栈时无法申请足够内存时会抛出OUtOfMemoryException
4.本地方法栈
如果Java虚拟机实现需要C Stack来访问本地语言时,这个C Stack就是本地方法栈.与Java虚拟机栈类似本地方法栈是为本地方法服务的.HotSpot VM中Java虚拟机栈和本地方法栈是合二为一的.同Java虚拟机栈一样异常情况也会抛出StackOverflow和OUtOfMemoryException
5.程序计数器
程序计数器(Program Counter Register)也叫PC寄存器,是一块较小的内存空间,处理器为了能连续执行,需要某种手段记录下一条指令的地址,程序计数器就是起这个作用的.虚拟机的多线程就是通过处理轮流切换线程的执行时间来实现的,某一时刻只能有一个处理处理某个线程的一条指令,切换线程后为了能恢复到正确的执行位置,每一个线程需要一个程序计数器,因此程序计数器是线程私有的.
感谢
https://www.cnblogs.com/czwbig/p/11127124.html
https://www.cnblogs.com/newAndHui/p/11168791.html
http://liuwangshu.cn/java/jvm/1-runtime-data-area.html
网友评论