zoukankan      html  css  js  c++  java
  • (一)JVM-Java运行时数据区域

    运行时数据区

    java虚拟机在执行java程序的时候会将内存划分为如下几个区域,有的区域是线程共享的,但有的是区域则是线程隔离。

    java runtime data area

    程序计数器(Promgram Counter Register)
    • 程序计数器是一块较小的内存空间
    • 字节码解释器工作时通过改变计数器的值来选取下一条字节码指令,程序分治,循环,跳转异常处理等都由它完成。
    • 任何一个确定的时刻,一个处理器都只会执行一条线程中的命令,每个线程都有独立的程序计数器。在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿,所以它线程私有的。
    • 唯一没有规定OutOfMEmoryError的区域
    java虚拟机栈
    • 线程私有
    • 生命周期和线程相同,是java方法执行的内存模型
    • 在执行方法时会先创建栈帧(stack frame)用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法调用的过程就是对应栈帧出栈入栈的过程。
    • 局部变量表:存放编译器可见的各种基本数据类型,对象引用类型,long和double会占用两个局部变量空间。
    • 如果线程请求的栈深度超过限制则会抛出StackOVerflowError。如果虚拟机在申请内存时无法申请到足够的内存则会抛出OutOfMemoryError。
    本地方法栈
    • 提供native方法服务。
    java堆
    • java堆是java虚拟机管理内存中最大的一块。
    • 线程共享,存放几乎所有的对象实例。
    • 垃圾搜集器主要管理的区域。
    • 可通过-Xmx -Xms来限制此区域的内存大小。
    • 无法申请到内存时抛出OutOfMemoryError异常
    方法区
    • 线程共享,是堆逻辑分区的一部分
    • 存放虚拟机加载的类型信息、常量、静态变量等
    • 虚拟机规范将其划分为堆的一个逻辑分区
    • 无法申请到内存时抛出OutOfMemoryError异常
    运行时常量池
    • 方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载完成后进入方法区的常量池
    • 具有动态性,运行期间也可将新的常量放入池中,比如String的intern方法。
    • 无法申请到内存时抛出OutOfMemoryError异常。

    直接内存

    • 直接内存不是虚拟机运行时数据区域的一部分,是堆外内存,比如NIO就是使用直接内存,受限制于本机内存,当申请不到内存时也会抛出OutOfMemoryError。
    • 优点是具有更快的速度,缺点是不受jvm内存限制。

    关注下方微信公众号,一起阅读经典书籍
    关注公众号,一起阅读经典书籍

  • 相关阅读:
    基于CentOS7配置ArcGIS enterprise
    ArcGIS pro 发布地图服务(一)动态地图服务
    ArcGIS操作技巧——怎样把地图放到PPT中,并且进行编辑?
    ArcGIS Earth1.9最新版安装和使用教程
    ArcGIS pro2.3中添加天地图底图
    excle函数
    网闸和防火墙
    NoSQL——not onlySQL不仅仅是SQL
    leaflet学习一 入门
    openlayer3 基础学习一创建&显示地图
  • 原文地址:https://www.cnblogs.com/vincili/p/9280563.html
Copyright © 2011-2022 走看看