JAVA笔记六:JVM内存和gc

JVM是一份本地化的程序(可执行的文件),程序运行起来成为进程。java程序是跑在JVM上的,严格来讲,是跑在JVM实例(JVM跑起来的进程)上,二者合起来称之为一个JAVA进程。各个JVM实例之间是相互隔离的。

Jvm内存
• 方法区(Method Area):全局共享,持久代。方法区存放了要加载的类的信息(如类名、修饰符等)、静态变量、构造函数、final定义的常量、类中的成员变量和方法等信息。运行时常量池(Runtime Constant Pool)是方法区的一部分,用于存储编译器生成的常量和引用(比如Integer的int数字-128~127,还有String,但是不包括使用new进行初始化的情况,此时需放在堆中)。一般来说,常量的分配在编译时就能确定,但也也可以存储在运行时期产生的常量(比如String类的intern()方法能强制字符串入常量区)。
• 堆区(Heap):全局共享,GC重点工作区。用于存放对象实例及数组,所有new出来的对象都存储在该区域。
• 虚拟机栈(VM Stack):线程独占,生命周期和线程相同,内存大小在编译时即固定。栈帧用于存储局部变量表(只包含基本数据类型和对象的引用,对象本身还是存在堆中)、动态链接、操作数和方法出口等信息,当方法被调用时,栈帧入栈,当方法调用结束时,栈帧出栈。所以无限的递归方法会导致栈溢出。
• 本地方法栈(Native Method Stack):线程独占。用于执行native方法,运行机制同虚拟机栈他们的运行机制一致。
• 程序计数器(Program Counter Register):存储当前线程执行的字节码(.class文件)行号,由CPU自行控制,不会内存溢出。
JAVA笔记六:JVM内存和gc_第1张图片

你可能感兴趣的:(JAVA笔记六:JVM内存和gc)