zoukankan      html  css  js  c++  java
  • JVM系列(一) — Jvm内存模型

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

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

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

    一、线程共享区

    这部分区域又分为堆(Heap)和方法区(也就是通常所说的非堆内存),在jdk7及其后续版本中,方法区和堆得区分比较模糊,已经将方法区并入堆中,作为"特殊的堆"

    1、Heap

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

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

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

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

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

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

    2、Non-Heap

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

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

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

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

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

    特别的:运行时常量池

    Class文件的描述信息中除了类的版本,字段,方法,接口外,还有一项是常量池,用于存放编译期生成的各种字面量和符号引用,字面量包括基本类型和对象类型(String,数组等)的常量值

    符号引用主要包括一些文本形式的类、接口的全限定名,方法或字段的名称和描述符,这部分将在类加载完成后进入方法区的运行时常量池中存放,jdk7及其以后的,存储在堆中

    此外,除编译期的常量外,运行期间产生的新的常量,例如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文件结构和类加载的内容将在后序的篇章中一一介绍

  • 相关阅读:
    android 6.0 新特性
    接口_ _接口回调机制
    bug_ _
    volley_缓存介绍
    bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码
    文章--笔记本蓝牙可以搜索到手机,但是怎么连接不了?
    Dialog_ _dialog系统样式讲解 及 透明背景
    动画_ _ Android应用开发之所有动画使用详解
    view坐标_ _ Android应用坐标系统全面详解
    html__脚本之家
  • 原文地址:https://www.cnblogs.com/yb38156/p/9409189.html
Copyright © 2011-2022 走看看