深入理解JVM------java内存区域概述

引言

        最近准备看两本书,一本是《深入理解计算机系统》,另一本是《深入理解java虚拟机》,两本都是提升内功的必备经书,思来想去,最终还是决定先看jvm(因为这本书相对薄一些)。现在,让我们一起来探索下jvm的奥秘吧,如若有不同理解的地方,欢迎各位猿友一起探讨。

运行时数据区域

        java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域。根据java虚拟机规范,将内存划分为以下六个部分,分别是:程序计数器java虚拟机栈java堆方法区本地方法栈运行时常量池。

结构图

        下图是引用百度文库的一张jvm结构图,由于运行时常量池是由方法区分出来的,所以此图中没有标注运行时常量池。


内存区域详解

        程序计数器(线程独有):它是一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器,记载着每一个线程当前运行java方法的地址,如果正在执行的是Native方法,则这个计数器值为空。程序中,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖程序计数器来完成。直观想象下,在多线程中,线程切换后,如果没有记住每个线程当前的位置,那么如何能恢复呢。因此,每个线程都有一个独立的程序计数器。

        java虚拟机栈(线程独有):java虚拟机栈在线程创建的同时创建,用于储存栈帧,它是线程私有的,生命周期与线程相同。

        【栈帧】:栈帧是随着方法的创建而创建,随着方法的结束而结束,它存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息,简单来说,就是方法运行时的临时数据存储区域。

       Java堆(全局共享):java堆随着虚拟机的启动而创建,几乎所有的实例对象和数组都要在这里分配内存,是虚拟机内存中最大的一块。

        方法区(全局共享:方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

        本地方法栈(线程独有:本地方法栈用来支持Native方法执行。

内存管理

        内存的管理分为内存的分配和内存的释放,上面的五个内存区域,大致可以分为两类全局共享线程独有

        线程独有的这部分内存可以理解为随着线程的启动而创建,随着线程的销毁而释放,这部分内存由java虚拟机来主动管理,不需要垃圾收集器(GC)的管理。

        全局共享的这部分内存的分配主要由程序中显示的new关键字来触发的,至于在哪分配,如何分配则是由java虚拟机来决定的。而这部分内存的释放,则是由垃圾收集器(GC)来管理的。

结束语

        本章节的内容到此结束,下一章将介绍GC的策略及算法。

猜你喜欢

转载自blog.csdn.net/cool_summer_moon/article/details/80318975