一、JVM模型概述

  java虚拟机(JVM)在java程序运行的过程中,会将它所管理的内存划分为若干个不同的数据区域,这些区域有的随着JVM的启动而创建,有的随着用户线程的启动和结束而建立和销毁。一个基本的JVM运行时内存模型如下所示:

  上图展示的是“JAVA SE7”的JVM虚拟机规范。注意,虚拟机规范并不是一成不变的,Oracle在发布新的JAVA版本时,可能会对JVM做一定的优化和改进,例如在JDK8的版本中,方法区被移除,取而代之的是metaspace(元数据空间)。

  在本章及下面的章节中,将以JDK7的标准作为例子,对JVM的运行时数据区进行讲解。

二、程序计数器(Program Counter Register)

2.1)什么是程序计数器

  程序计数器是一个记录着当前线程所执行的字节码的行号指示器。
  JAVA代码编译后的字节码在未经过JIT(实时编译器)编译前,其执行方式是通过“字节码解释器”进行解释执行。简单的工作原理为解释器读取装载入内存的字节码,按照顺序读取字节码指令。读取一个指令后,将该指令“翻译”成固定的操作,并根据这些操作进行分支、循环、跳转等流程。
  从上面的描述中,可能会产生程序计数器是否是多余的疑问。因为沿着指令的顺序执行下去,即使是分支跳转这样的流程,跳转到指定的指令处按顺序继续执行是完全能够保证程序的执行顺序的。假设程序永远只有一个线程,这个疑问没有任何问题,也就是说并不需要程序计数器。但实际上程序是通过多个线程协同合作执行的。
  首先我们要搞清楚JVM的多线程实现方式。JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。也就是说,某个线程在执行过程中可能会因为时间片耗尽而被挂起,而另一个线程获取到时间片开始执行。当被挂起的线程重新获取到时间片的时候,它要想从被挂起的地方继续执行,就必须知道它上次执行到哪个位置,在JVM中,通过程序计数器来记录某个线程的字节码执行位置。因此,程序计数器是具备线程隔离的特性,也就是说,每个线程工作时都有属于自己的独立计数器。

2.2)程序计数器的特点

  1.线程隔离性,每个线程工作时都有属于自己的独立计数器。
  2.执行java方法时,程序计数器是有值的,且记录的是正在执行的字节码指令的地址(参考上一小节的描述)。
  3.执行native本地方法时,程序计数器的值为空(Undefined)。因为native方法是java通过JNI直接调用本地C/C++库,可以近似的认为native方法相当于C/C++暴露给java的一个接口,java通过调用这个接口从而调用到C/C++方法。由于该方法是通过C/C++而不是java进行实现。那么自然无法产生相应的字节码,并且C/C++执行时的内存分配是由自己语言决定的,而不是由JVM决定的。
  4.程序计数器占用内存很小,在进行JVM内存计算时,可以忽略不计。
  5.程序计数器,是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError的区域。

最新文章

  1. python核心编程(第二版)习题
  2. Ubuntu 安装搜狗拼音及fcitx
  3. SQL top查询
  4. 2014-08-01 ASP.NET中对SQLite数据库的操作——ADO.NET
  5. CQRS
  6. 数据持久化之SP的优化—送工具类
  7. 用PHPExcel类读取excel文件的内容
  8. 【转载】ASP.NET Core Web 支付功能接入 支付宝-电脑网页支付篇
  9. python 2.7和3.7都支持的情况 bit_length() pycharm 更改解释器
  10. 全网最详细的基于Ubuntu14.04/16.04 + Anaconda2 / Anaconda3 + Python2.7/3.4/3.5/3.6安装Tensorflow详细步骤(图文)(博主推荐)
  11. 基于ip的虚拟主机配置——在一台服务器上绑定多个 IP 地址
  12. Angular 学习笔记 ( 创建 library, 转换老旧的 library )
  13. Windows程序执行过程
  14. 使用nginx服务器如果遇到timeou情况时可以如下设置参数,使用fastcgi: fastcgi_connect_timeout 75; 链接 fastcgi_read_timeout 600; 读取 fastcgi_send_timeout 600; 发请求
  15. Java枚举类型的用法
  16. Shell 将两个文件按列合并
  17. Linux虚拟机与Windows共享文件
  18. .Net 数据库(SqlServer2008)的备份、还原
  19. c++ primer敲代码第二章
  20. windows 服务安装报错

热门文章

  1. Gradle 教程
  2. Angular打开页面隐藏显示表达式
  3. hdu2586(LCA最近公共祖先)
  4. 9.17 Django ORM分组
  5. Java工程师之SpringBoot系列教程前言&目录
  6. Anaconda安装教程+Tensorflow教程
  7. LAMP部署流水
  8. linker command failed with exit code 1 (use -v to see invocation) 变量重名
  9. 基于bind搭建DNS主从
  10. 正则表达式(二):Unicode诸问题上篇(转)