1、方法区,堆
堆所有线程共享的内存,虚拟机启动时分配,存放对象实例和数组。逃逸分析、栈上分配、标量替换等技术导致所有对象不一定都在堆中分配。
分为新生代和老年代。主要有Eden空间,From Survivor空间和To Survivor空间。
方法区,各个线程共享的内存区。用于存储已经被加载的类信息和常量和静态变量、即时编译器编译后的代码数据,被称为永久代,Permanent Generation。这块垃圾回收主要是类卸载和常量池的回收,
一般来说回收结果比较难让人满意。
运行时常量池
方法区的一部分,class文件类、接口、字段、方法、版本等信息,还有一项信息就是常量池。常量池,用于存放编译期间生成的各种字面量和符号引用。这部分内容类加载后进入方法区的运行时常量池中
存放。并不一定编译才会产生常量,运行期间也可能将新的常量放入池中,如String.intern().
2、虚拟机栈、本地方法栈、程序计数器
程序计数器,记录每个线程要执行的下一条指令的地址,执行本地方法为空,执行java方法记录下一条指令的地址,没有规定内存溢出。
虚拟机栈包括栈帧,每个方法都包含一个栈帧,局部变量表,操作数栈,动态链接,方法出口等信息。方法从调用到执行完成,对应着一个栈帧的出栈入栈。
局部变量表内存空间分配在编译期间就完成了。
3直接内存
java nio通过native函数库直接分配堆外内存,通过DirectByteBuffer对象作为内存的引用操作,
原文:https://www.cnblogs.com/xiaofeiyang/p/12418209.html