上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理。
程序计数器:当前线程所执行的字节码的行号指示器,虚拟机下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖改变这个计数器的值来完成。
栈:保存局部变量、引用,方法调用结束即被释放。每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口
等信息。每一个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。分为虚拟机栈和本地方法栈
堆:在虚拟机启动时创建,被所有线程共享,存储对象实例,由java垃圾收集器(GC)进行内存释放管理。
方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等,也是所有线程共享的区域。
常量池(Constant Pool):方法区的一部分,java语言并不要求常量只能在编译时产生,运行时也可将新的常量放入常量池中,String类的intern()方法是用的较多的运行时常量添加方式。
静态区:方法区的一部分,存储static修饰的成员(静态变量或static修饰的块)或全局变量。
下面是java在内存中的执行流程
:
分类:
java