总结自《深入理解java虚拟机》

很多博客在讲虚拟机内存模型时,比较宽泛或者粗化,甚者,不准确,以下是我的一个笔记照片

运行时数据区可以分为两部分:线程共享区和线程私有区

一、线程共享区

这部分区域又分为堆(Heap)和方法区(也就是通常所说的非堆内存)

1、Heap

(1)堆是在JVM启动时创建,主要存放对象实例,在虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配,但是随着技术的发展,这一点也并不绝对了;

(2)堆是垃圾收集器管理的主要区域,因此有时也成为"GC堆"(垃圾堆);关于垃圾回收的介绍将在下篇文章单独介绍

(3)当前主流的虚拟机都是按照可扩展的配置来实现堆的分配,也就是我们在开发工具中常见的配置最大最小堆参数:-Xmx,-Xms

(4)如果堆中没有内存来完成实例分配,也无法再扩展时,将抛出OutOfMemoryError

(5)根据java虚拟机的规范,堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,笔者查阅相关资料理解这句话,这和操作系统的内存管理机制有关,垃圾回收会产生许多小的碎块,

叫做堆碎片,当某个碎片无法满足一个较大的对象分配所需的内存时,操作系统可以将若干不连续的碎片分配给该对象存储,并登记好碎片区域与该对象信息的一种映射关系来完成;

2、Non-Heap

也就是平时所说的非堆。有的开发者也称永久代,笔者认为为避免歧义,最好忘掉这个称呼,可自行查阅相关概念

(1)非堆区域主要用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等。

(2)垃圾收集行为在该区域较少出现,设置可以选择不实现垃圾收集

(3)该区域的内存回收目标主要是针对常量池的回收和对类型的卸载

(4)当方法区无法满足内存分配需求时将抛出OutOfMemoryError异常

特别的:运行时常量池

Class文件的描述信息中除了类的版本,字段,方法,接口外,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,这部分将在类加载完成后进入方法区的运行时常量池中存放

此外,除编译期的常量外,运行期间产生的新的常量,例如String类的intern()方法产生的String类的常量也会放入运行时常量池中

二、线程私有区

1、VM Stack(java虚拟机栈)

(1)虚拟机栈的生命周期与线程相同

(2)描述的是Java方法执行的内存模型。每个方法在执行的时候会创建一个栈帧(Stack Frame),用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用到执行完毕

的过程就对应一个栈帧在虚拟机栈中入栈到出栈的过程

(3)栈溢出:StackOverflowError,写过递归方法的一定对这个异常很敏感,如果线程请求的栈深度大于虚拟机所允许的栈深度,将抛出此异常;内存不够分配时也可能抛出OutOfMemoryError异常

2、Native Method Stack(本地方法栈)

(1)虚拟机栈为虚拟机执行java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务(Native方法不由java实现,用C、C++实现)

(2)有的虚拟机直接将本地方法栈和虚拟机栈合二为一,譬如我们用的最多的HotSpot虚拟机

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

该区域较小,可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。分支,循环,跳转,异常处理等基础功能

都由该计数器来完成。此区域是唯一一个在jvm规范中没有规定任何OutOfMemoryError情况的区域

关于该篇提到的垃圾收集,Class文件结构和类加载的内容将在后序的篇章中一一介绍

JVM系列(一) — Jvm内存模型的更多相关文章

  1. jvm系列五-java内存模型(2)

    原作者系列文章链接:并发编程系列博客传送门 前言# 在网上看了很多文章,也看了好几本书中关于JMM的介绍,我发现JMM确实是Java中比较难以理解的概念.网上很多文章中关于JMM的介绍要么是照搬了一些 ...

  2. jvm系列五-java内存模型初览(1)

    本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入理解Java虚拟机>和<Java并发编程的艺术>等书中也都有关 ...

  3. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  4. jvm系列(四):jvm知识点总结

    原文链接:http://www.cnblogs.com/ityouknow/p/6482464.html jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 ...

  5. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  6. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  7. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  8. JVM系列三:JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

  9. jvm系列 (一) ---jvm内存区域与溢出

    jvm内存区域与溢出 目录 jvm系列(一):jvm内存区域与溢出 jvm系列(二):垃圾收集器与内存分配策略 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时 ...

  10. JVM的艺术—JAVA内存模型

    *喜欢文章,动动手指点个赞 * 引言 亲爱读者你们好,关于jvm篇章的连载,前面三章讲了类加载器,本篇文章将进入jvm领域的另一个知识点,java内存模型.彻底的了解java内存模型,是有必要的.只要 ...

随机推荐

  1. 最小生成树,Prim算法实现

    最小生成树 所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小. 首先看看第一个例子,有下面这样一个带权图: 它的最小生成树是什么样子呢?下图绿色加粗的边可 ...

  2. JavaScript的变量作用域

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. C# 跨线程调用控件的4中方法

    原文:C# 跨线程调用控件 在C# 的应用程序开发中, 我们经常要把UI线程和工作线程分开,防止界面停止响应.  同时我们又需要在工作线程中更新UI界面上的控件, 下面介绍几种常用的方法 阅读目录 线 ...

  4. 1. ZooKeeper简介

    1. ZooKeeper是什么 ZooKeeper致力于提供一个高性能.高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoo ...

  5. 手模手配置Eslint,看懂脚手架中的Eslint

    使用ESLint前:eslint是干嘛的,我这样写有什么问题,怎么还报错了,太麻烦想去掉这个插件,脚手架中关于eslint文件里的配置是什么意思?怎么设置配置项和规则达到自己想要的检测效果呢?怎么集成 ...

  6. Electron 无边框窗口最大化最小化关闭功能

    Electron 无边框窗口最大化最小化关闭功能 目的 实现无边框窗口,并添加最大化最小化和关闭功能 前提 了解Electron 主进程和渲染进程的通讯 了解 BrowserWindow相关功能 操作 ...

  7. python 异常处理【转载】

    什么是异常?异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行.一般情况下,在Python无法正常处理程序时就会发生一个异常.异常是Python对象,表示一个错误.当Python脚本 ...

  8. CentOS下安装中文man 手册

    为了方便使用man,安装中文手册,具体如下: 版本:CentOS release 6.6 (Final) 中文包:http://pkgs.fedoraproject.org/repo/pkgs/man ...

  9. Zookeeper3.4.14集群搭建

    环境: 3台centos7.4 1. 下载release:wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3. ...

  10. php 从7.0升级到7.2

    下面的方法安装的php是非线程安全的,apache2服务器用不了 1. 添加Ondřej Surý提供的PHP源: sudo apt-get install software-properties-c ...