美文网首页
java的内存管理机制

java的内存管理机制

作者: lionel880 | 来源:发表于2020-04-07 16:30 被阅读0次

    前言

    对于java语言而言,将内存交给虚拟机管理,是一大特性,理解java内存管理机制,也是了解后续gc等的基础。

    大部分情况下,我们只关注内存中的堆和栈,这是一个简单的划分,实际会更为复杂,作为java的开发从业者,应该要理清细节。

    image.png

    数据运行区域

    • 1.程序计数器
      程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在学汇编的时候,我们了解到,下一步执行到哪一行,都是需要进行记录的,这个计数器就是负责来选取下一条需要执行的字节码指令,分支、 循环、 跳转、 异常处理、 线程恢复的。所以这个程序计数器是“线程私有”的内存

    • Java虚拟机栈
      这个我们最熟悉的栈,生命周期和线程相同。每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、 操作数栈、 动态链接、 方法出口等信息。 每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
      我们最关注的是里面的局部变量表,里面放了基础类型和对象的引用。
      当你用递归等方式时,可能会导致栈空间不足,报stackOverFlowError,但现在大部分虚拟机支持动态栈扩容技术,如果无法扩容,则报OutOfMemoryError

    • 本地方法栈
      类似于虚拟机栈,区别在于它执行的是虚拟机用到的Native方法服务。

    • Java堆
      Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,用途是为了存放对象实例。
      java堆也是垃圾收集器管理的主要区域,根据GC来分,可以进行分代。

    • 方法区
      各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、 常量、 静态变量、 即时编译器编译后的代码等数据。不同的虚拟机对于方法区的实现是不一样的,但新架构应该是往独立的方法区去进行设计。
      里面会有一些常量池等,常量池就是一些final修饰的,不可变的常量,主要有字面量和引用量

    • 直接内存
      仅做了解,java在NIO类,可以对堆外内存进行操作。

    相关文章

      网友评论

          本文标题:java的内存管理机制

          本文链接:https://www.haomeiwen.com/subject/hjeezctx.html