JVM_1.0_运行时内存区域

运行时内存区域这块,如果不将内存各个区域做什么的了解清楚,后面看的会很累。

之前将JVM运行时内存区域的内容,整理在了一篇文章中。

在后续深入、细致的学习中,整理的内容越来越多,一篇的话,会导致篇幅过长。

所以将《JVM运行时内存区域详解》分为以下几个章节:

JVM_1.0_运行时内存区域

JVM_1.1_运行时内存区域_堆

JVM_1.2_运行时内存区域_Java虚拟机栈

JVM_1.3_运行时内存区域_方法区

JVM_1.4_运行时内存区域_本地方法栈

JVM_1.5_运行时内存区域_程序计数器

JVM_1.6_运行时内存区域_运行时常量池

JVM_1.7_运行时内存区域_栈帧

 

这里将《Java虚拟机规范中文版》上传了,点击下面链接,即可下载

Java虚拟机规范SE7中文版下载

 

目录

运行时内存区域

方法区

Java虚拟机栈

本地方法栈

程序计数器


 

运行时内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。

根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域:

(图片来自网络)

我们先看看上图灰色的部分:运行时数据区。图中很细心的帮我们做好了区分。

运行时数据区按照线程共享与否,可以划分为:线程共享线程私有

线程共享:方法区、堆

线程私有:Java栈(虚拟机栈)、本地方法栈、程序计数器

注意:堆是堆(heap)栈是栈(stack)堆栈是栈

 

线程共享,唯一作用就是存放对象实例。所有的对象实例及数组,都需要在堆中分配内存。

堆内存是垃圾收集器管理的主要区域,有时也被称为GC堆。

从内存回收的角度看,由于现在垃圾收集器都是基于分代收集算法,所以堆还可以被细分为:新生代和年老代

堆可以处于物理上不连续的空间中,只要逻辑上连续即可

 

方法区

线程共享,用于存储已被虚拟机加载的类信息、常量、静态变量等数据。

永久代是HotSpot虚拟机特有的概念,永久代是方法区的一种实现。

在《Java虚拟机规范》中,只是规定了有方法区这么一个概念和它的作用,并没有规定如何去实现它。

 

Java虚拟机栈

线程私有,虚拟机栈描述的是Java方法执行的内存模型。

每个方法在执行时会创建一个栈帧,用来存储局部变量表、操作数栈、方法出口等信息。

每一个方法从调用直至完成的过程,就对应一个栈帧在虚拟机栈中 入栈 到 出栈的过程。

 

本地方法栈

线程私有。本地方法栈 发挥的作用 与 Java虚拟机栈类似。

只不过 虚拟机栈 为虚拟机执行Java方法服务,而本地方法栈为虚拟机用到恩native方法。

简单地讲,一个Native Method就是一个java调用非java代码的接口。

 

程序计数器

线程私有,每个线程都有一个,用来记录线程执行到哪里。

因为多线程时,线程会来回切换,为了线程切换后回到正确的执行位置,每个线程都需要一个程序计数器。

隔条线程之间的程序计数器完全独立,互不影响。

 

为了方便理解,将学习到的运行时内存区域,以图例的方式画出来了,以供参考

(完整的visio文件上传了GitHub,需要的同学自取,如果觉得还不错,麻烦点个star)

JVM-运行时内存区域-Visio原文件

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值