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

JVM运行时数据区

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

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

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

线程独享的区域

程序计数器

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

虚拟机栈

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

本地方法区

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

全局共享的区域

方法区

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

运行时常量池

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

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

理解JVM——JVM的结构的更多相关文章

  1. JVM的基本结构

    首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数 ...

  2. 了解java虚拟机---JVM的基本结构(1)

    1. JVM的基本结构 1.1. 类加载子系统 类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间.方法区中可能还会存放运行时常量信息,包括字符串与数字常量.(这部 ...

  3. JVM的内存结构,JVM的回收机制

    内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...

  4. 概览JVM的基本结构和JVM内存结构

    概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...

  5. JVM之内存结构详解

    对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...

  6. 深入理解JVM—JVM内存模型

    我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...

  7. 巩固java(二)----JVM堆内存结构及垃圾回收机制

    前言:        我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构   ...

  8. JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)

    一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...

  9. 【转】深入理解JVM—JVM内存模型

    http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU ...

随机推荐

  1. 利用扩展方法重写JSON序列化和反序列化

    利用.NET 3.5以后的扩展方法重写JSON序列化和反序列化,在代码可读性和可维护性上更加加强了. 首先是不使用扩展方法的写法 定义部分: /// <summary>  /// JSON ...

  2. JSTL判断list是否为空

    1.先在jsp页面中导入下列类库. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" ...

  3. SEDA架构程序实现

    一.SEDA SEDA全称是:stage event driver architecture,中文直译为“分阶段的事件驱动架构”,它旨在结合事件驱动和多线程模式两者的优点,从而做到易扩展,解耦合,高并 ...

  4. Vue 中的 v-cloak 解读

    v-cloak 的作用和用法 用法: 这个指令保持在元素上直到关联实例结束编译.和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Must ...

  5. 分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC (转载 不错)

    分布式理论基础(一)一致性及解决一致性的两种方式:2PC和3PC 1 一致性 1.1 简述 一致性,是指对每个节点一个数据的更新,整个集群都知道更新,并且是一致的 假设一个具有N个节点的分布式系统,当 ...

  6. 一文理解JS的节流、防抖及使用场景

    函数防抖(debounce):在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时. 看一个

  7. cf444E. DZY Loves Planting(并查集)

    题意 题目链接 Sol 神仙题啊Orzzzzzz 考场上的时候直接把树扔了对着式子想,想1h都没得到啥有用的结论. 然后cf正解居然是网络流??出给NOIP模拟赛T1???¥%--&((--% ...

  8. Django随笔

    入门 小Demo设计介绍 本示例完成“图书-英雄”信息的维护,需要存储两种数据:图书.英雄 图书表结构设计: 表名:BookInfo 图书名称:btitle 图书发布时间:bpub_date 英雄表结 ...

  9. React—Native开发之原生模块向JavaScript发送事件

    首先,由RN中文网关于原生模块(Android)的介绍可以看到,RN前端与原生模块之 间通信,主要有三种方法: (1)使用回调函数Callback,它提供了一个函数来把返回值传回给JavaScript ...

  10. 基于OpenMP的C++并行编程简单示例

    示例要求:在整数A和B之间找到符合条件的值X,使f(X)=C. 示例代码(需要在VS中开启OpenMP支持): #include<iostream> #include<time.h& ...