理解JVM——JVM的结构
这是理解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的结构的更多相关文章
- JVM的基本结构
首先,当一个程序启动之前,它的class会被类装载器装入方法区,执行引擎读取方法区的字节码自适应解析,边解析就边运行(其中一种方式),然后pc寄存器指向了main函数所在位置,虚拟机开始为main函数 ...
- 了解java虚拟机---JVM的基本结构(1)
1. JVM的基本结构 1.1. 类加载子系统 类加载子系统负责从文件或者网络中加载Class信息,加载的类信息存放于方法区的内存空间.方法区中可能还会存放运行时常量信息,包括字符串与数字常量.(这部 ...
- JVM的内存结构,JVM的回收机制
内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...
- 概览JVM的基本结构和JVM内存结构
概览JVM的基本结构和JVM的内存结构 这里概要介绍一下JVM在启动后,作为操作系统的一个进程的基本结构,以及从操作系统角度看,JVM如何管理它从操作系统里申请来的内存的,也就是JVM的内存结构或者叫 ...
- JVM之内存结构详解
对于开发人员来说,如果不了解Java的JVM,那真的是很难写得一手好代码,很难查得一手好bug.同时,JVM也是面试环节的中重灾区.今天开始,<JVM详解>系列开启,带大家深入了解JVM相 ...
- 深入理解JVM—JVM内存模型
我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...
- 巩固java(二)----JVM堆内存结构及垃圾回收机制
前言: 我们在运行程序时,有时会碰到内存溢出(OutOfMemoryError)的问题,为了解决这种问题,我们有必要了解JVM的内存结构和垃圾回收机制. 正文: 1.JVM堆内存结构 ...
- JVM 垃圾回收机制和常见算法和 JVM 的内存结构和内存分配(面试题)
一.JVM 垃圾回收机制和常见算法 Sun 公司只定义了垃圾回收机制规则而不局限于其实现算法,因此不同厂商生产的虚拟机采用的算法也不尽相同.GC(Garbage Collector)在回收对象前首先必 ...
- 【转】深入理解JVM—JVM内存模型
http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU ...
随机推荐
- 009.在C#.NET中使用Froms验证
原文:https://support.microsoft.com/en-us/kb/301240 (Aty表示本人) 这篇文章演示如何通过数据库,实现Froms验证 必需 Mircosoft Visu ...
- WCF DEMO1 创建自托管宿主
using System; using System.ServiceModel; using System.ServiceModel.Channels; //注意:需要引用程序集 System.Ser ...
- NSLog演化
使用下面代码打印行号,功能函数,以及要打印的内容 #if DEBUG #define MBLog(format, ...) NSLog((@"%s--[Line:%d]--" fo ...
- spring MethodInterceptor方法拦截
引用别的的:https://blog.csdn.net/u010739551/article/details/47754731 最近项目里加上了用户权限,有些操作需要登录,有些操作不需要,之前做项目做 ...
- VS2013平台安装Qt插件过程
1.下载所需安装包: Qt5.3.Qt插件下载地址:http://qt-project.org/downloads. qt-vs-addin-1.1.11-opensource.exe 下载地址:ht ...
- centos7下更新firefox
下载最新版firefox 1.点击三条线-问号-firefox帮助-安装和更新-linux安装-系统和语言下载 保存到指定目录,比如home下 2.解压 tar xjf firefox-*.tar.b ...
- 设计模式学习——代理模式(Proxy Pattern)之 强制代理(强校验,防绕过)
上周温习了代理模式:http://www.cnblogs.com/chinxi/p/7354779.html 在此进行拓展,学习强制代理.但是发现网上大多例子都有个“天坑”(我是这么认为的),在得到代 ...
- 【学习笔记】--- 老男孩学Python,day15 python内置函数大全,递归,二分法
1. lamda匿匿名函数2. sorted()3. filter()4. map()5. 递归函数 一. lamda 匿名函数 为了了解决一些简单的需求⽽设计的⼀句话函数 语法: 函数名 = lam ...
- 小程序:获取input输入的值
wxml <input placeholder='输入你的姓名' value='{{name}}' bindblur='nameblur'></input> js data ...
- Spring 配置数据源之一三兄弟
前期的准备工作,我们是使用的是maven,我们下载节点即可... 节点如下: <dependency> <groupId>org.springframework</gro ...