-
java内存分区
-
程序计数器:
是一块较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。(线程私有,不存在异常抛出)
-
Java虚拟机栈:
生命周期跟线程相同,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、方法出口等信息。每个方法从调用知道执行完的过程,对应着在虚拟机栈中入栈到出栈的过程。
线程私有,定义大量本地变量或者减小栈内存空间会抛出StackOverflowError,设置每个线程栈内存越大越容易抛出OutOfMemoryError异常
局部变量表:基本数据类型、对象引用、returnAddress类型
returnAddress类型:Java虚拟机的jsr、ret和jsr_w指令所使用指向一条字节码指令。
-
本地方法栈
本地方法栈与虚拟机栈所发挥的作用基本相似,他们的区别不过是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的native方法服务。sun HotSpot 虚拟机 把本地方法栈与虚拟机栈合二为一。
-
Java堆
Java堆是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。
Java堆唯一目的是存放对象实例,几乎所有的对象实例都在这里分配内存。
从内存回收的角度来看,由于现在收集器基本都采用分代手机算法,所以java堆还可以细分为:新生代和老年代;再细致一点的有Eden空间、From Survivor空间、To Survivor空间等。
所有的对象实例以及数组都要在堆上分配,但是随着JIT 编译器的发展与逃逸分析技术成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分分配在堆上渐渐变得不是那么绝对,Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为"GC堆"。
线程共有,当存在大量无法被gc回收得类时会出现OOM异常。
-
方法区
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。虽然java虚拟机规范把方法去描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与java堆区分开来。在jdk7中,已经将放在永久代的字符常量池移出。
java内存分区
最新推荐文章于 2024-05-06 10:24:14 发布