JVM之Java内存区域
引言:最近读了深入理解JVM,在此将一些知识进行记录。
1.概述
因为存在虚拟机自动内存管理机制,java程序不容易出现内存泄漏和溢出的问题,不过一旦发生内存泄漏和溢出的问题,不了解虚拟机如何使用内存的话,排查错误将是一个很头疼的工作。
2.运行时数据区域
java程序在运行时会把其管理的内存分为若干个数据域。Java虚拟机所包含的运行时区域如下:
2.1 程序计数器
程序计数器是线程私有的内存,每个线程都有一个独立的程序计数器,其可以被看做是当前线程所执行的字节码的行号指示器,是控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基本功能都依靠该计数器实现。
2.2 Java虚拟机栈
虚拟机栈也是线程私有的,它的生命周期和线程相同。虚拟机栈主要描述的是java方法执行的线程模型。每个方法在执行的时候虚拟机栈创建一个栈帧,每个方法开始执行到执行结束的过程就对应栈帧在虚拟机栈中入栈到出栈的过程。
2.3 本地方法栈
本地方法栈和虚拟机栈类似,区别在于虚拟机栈为java方法(字节码)服务,而本地方法栈为本地方法(Native)服务。
2.4 java堆
Java堆是所有线程共享的一块模型,虚拟机启动时创建,该区域唯一目的就是存放对象实例。Java堆可以处于物理上不连续的区域,但是在逻辑上其应该被视为连续。
2.5 方法区
方法区也是线程共享的内存区域,该区域主要存储已加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。方法区的垃圾回收主要是针对常量池的回收和类型的卸载。
2.6 运行时常量池
运行时常量池是方法区的一部分,其用于存放编译时生成的各种字面量和符号引用,这部分内容在类加载后存放到运行时常量池中。此外运行时常量池还有动态性,运行期间也可以将一些常量放进运行时常量池中。
结语
本讲大概介绍了Java的运行时数据区域,其中程序计数器和本地方法栈以及Java虚拟机栈是每个线程独立拥有的,而方法区和堆是所有线程共享的内存区域。
作者:是xiuxi休息啊
链接:https://juejin.cn/post/7025825632726548487