zoukankan      html  css  js  c++  java
  • 理解JVM——JVM的结构

    这是理解JVM的第一篇文章,这篇文章主要介绍JVM的总体结构和每一个部分的功能。内容比较少,对于每一个部分详细的内容,放到后面的文章中,逐步展开。这个系列总结完,应该会对JVM有一个整体且深入的认识了。

    JVM运行时数据区

    center

    这是网上的一个JVM结构的示意图,还是比较清晰明了的说明了JVM结构。
    这篇文章主要介绍运行时数据区,关于类加载器的部分,放到下一篇文章讲解。
    从这个图中,可以看出运行时数据区可以细分为5项,分别是:

    • 方法区
    • 虚拟机栈
    • 本地方法区
    • 程序计数器

    一般写程序常见的区域是方法区,虚拟机栈,和堆。但这里,我们按照是否是全局共享的方式来对上述5个区域进行分类。为什么要这样分类,因为虽然这几个区域都是属于运行时数据区,但是这几个区域的创建时机是不一致的,有的是随虚拟机启动而创建的,随虚拟机销毁而销毁。有的是随线程创建而创建,随线程销毁和销毁。

    线程独享的区域

    程序计数器

    程序计数器是来指示当前线程正在执行的JVM指令,因此程序计数器是线程独有的。一个JVM支持多个线程,每一个线程都要自己的程序计数器。
    如果线程正在执行的方法是Java方法,则程序计数器保存的是当前线程正在执行的JVM指令,如果正在执行的方法是Native方法,则保存为空(undefined)。

    虚拟机栈

    虚拟机栈就是常说的栈内存,每一个线程在创建的时候,就会创建一个属于他的虚拟机栈。
    虚拟机栈存储着栈帧,栈帧中存放的局部变量表,方法部分返回值等,关于栈帧其他内容,后续再说。

    本地方法区

    本地方法区存储着native方法的调用状态,一般会随着线程创建而针对每一个线程分配。

    全局共享的区域

    方法区

    方法区是可供各个线程共享的内存区域,其主要存储着所加载的类的结构信息,如名称、修饰符等、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域。

    运行时常量池

    运行时常量池是方法区的一部分,存放着类中固定的常量信息、方法、和field的引用信息。JVM在加载类的时候会为每一个Class分配一个独立的常量池。

    初学Java,听到的最多的一个内存区域,简单来说就是存储着所有类实例和数组对象。

  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/qifengshi/p/6590327.html
Copyright © 2011-2022 走看看