• java虚拟机


    一、java虚拟机运行时数据区域主要分为:

    1.程序计数器(PC寄存器)

    2.java虚拟机栈:

      局部变量表、操作数栈、动态链接、方法出口等。(详见——)

    3.本地方法栈(JNI):

    4.堆:

    5.方法区:

      类信息、常量、静态变量、即时编译器编译后的代码。

      (jdk1.8 hotspot把类信息放在元空间,元空间一道本地内存;常量和静态变量移到了堆中

      数据段:类变量、常量

      代码段:方法的定义(堆中会留有一个地址值与方法区的值对应)

      全局变量(或者叫做字段,属性)在全局区(静态区)(我是把全局变量(成员变量)与实例变量等价,方法里的变量叫做局部变量。全局限量有默认值,局部变量没有默认值;或者全局变量、实例变量都叫实例变量,自己弄清楚就行)

        (1)全局变量既不在堆中,也不在栈中,而是在全局区(静态区),全局变量的存储和静态变量是在一起的。(我的理解:全局变量与静态变量都是类的字段/属性,用Static修饰的叫做静态变量,但是类的不同对象共享一个静态变量,累的不同对象各自有自己的一个全局变量)。代码举例如下:(参见——————)

        (2)初始化的全局变量和静态变量在同一块区域“数据段”;未初始化的全局变量和静态变量在相邻的另一块区域“数据段中的BSS段:特点是可读可写;在程序执行前BSS段会清0”

    6.运行时常量池:

    class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池。

    Class 文件中的常量池(**编译器生成的字面量和符号引用**)会在类加载后被放入这个区域。

    除了在编译期生成的常量,还允许动态生成,例如 String 类的 intern()。eg:"hello".intern(),但是常量是若已经存在了“hello”,就不插入。

    运行时常量池是方法区的一部分,注意jdk1.8中hotspot虚拟机实现方法区时候,是把方法区放在了元空间,运行时常量池挪到了堆中,见下图

    JDK 版本方法区的实现运行时常量池所在位置字符串常量池所在位置
    JDK6 PermGen space(永久代) PermGen space(永久代) PermGen space(永久代)
    JDK7 PermGen space(永久代) PermGen space(永久代) Heap(堆)
    JDK8 Metaspace(元空间) Metaspace(元空间) Heap(堆

    注意:HotSpot实现的运行时数据区和Java虚拟机规范定义的还是有所不同的,

      ①、将**Java虚拟机栈和本地方法栈合二为一;

      ②、元数据区取代了方法区,并且元数据区不在Java虚拟机中,而是在本地内存中

      ③、运行时常量池方法区中移到了

    方法区是一个 JVM 规范,永久代与元空间都是其一种实现方式。在 JDK 1.8 之后,原来永久代的数据被分到了堆和元空间中。静态变量和常量池等放入堆中,元空间存储类的元信息。

    7.直接内存

      在 JDK 1.4 中新引入了 NIO 类,它可以使 用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。

  • 相关阅读:
    对应于 算法原型 中的“纸条”
    Hive 实际上对于所存储的文件的完整性以及数据内容是否和表结构一致无支配力
    kettle
    regularexpression_action
    Consumer Group Example
    Neural Task Programming: Learning to Generalize Across Hierarchical Tasks
    dm层 集市层 四层 Build a multi-level data strategy
    图片服务器 sns 加爬虫 免上云
    不等式放缩 维时间戳是数据仓库无时间维度的事实表的灾难 度表 事实表
    MaLoc: a practical magnetic fingerprinting approach to indoor localization using smartphones
  • 原文地址:https://www.cnblogs.com/sunupo/p/13590595.html
Copyright © 2020-2023  润新知