看了博主“一杯凉茶”一篇对java内存详解的文章后,虚心学习,并记录下来 ,以便日后再来温故。

一,运行时数据区

  

1、程序计数器

  当前线程所执行的字节码行号指示器,字节码解释器工作依赖计数器控制完成,通过执行线程行号记录,让线程轮流切换,使各条线程之间互不影响。

  线程私有,生命周期与线程相同,随JVM启动而生,JVM关闭而死。线程执行Java方法时,记录其正在执行的虚拟机字节码指令地址,

1、方法区

  在Java虚拟机中,关于被装载类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件----一个线性二进制数据流----然后将它传输到虚拟机中,紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也存储在方法区中。

  由于所有线程都共享方法区,因此它们对方法区数据的访问必须被设计为是线程安全的。比如,假设同时有两个线程都企图访问一个名为Lava的类,而这个类还没有被装载,那么,这时只应该有一个线程去装载它,而另一个线程只能等待。

  对每个装载的类型(类或接口),虚拟机都会在方法区中存储以下类型信息:

  1、这个类型的全限定名

  2、这个类型的直接超类的全限定名(除非这个类型是java.lang.Object,他没有超类)

  3、这个类型是类类型还是接口类型

  4、这个类型的访问修饰符(public、abstract或final的某个子集)

  5、任何直接超接口的全限定名的有序列表

  除了上述基本类型信息外,虚拟机还得为每个被装载的类型存储以下信息:

  1、该类型的常量池

  2、字段信息

  3、方法信息

  4、除了常量以外的所有类(静态)变量

  5、一个到类ClassLoader的引用

  6、一个到Class类的引用

  1.1常量池

    虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(String、integer和float point常量)和对其他类型、字段和方法符号的引用。池中的数据项就像数组一样是通过索引访问的,因为常量池存储了相应类型所用到的所有类型、字段和方法的符号引用,所以它在Java程序的动态连接中起着核心作用,常量池在后面会详解。

  1.2字段信息

    1、字段名

    2、字段的类型

    3、字段的修饰符(public、private、protected、static、final、volatile、transient的某个子集)

  1.3方法信息

    对于类型中声明的每一个方法,方法区中必须保存下面的信息。和字段信息一样,这些方法在类或接口中的声名顺序也必须保存。下面是方法信息的清单:

    1、方法名

    2、方法的返回类型(或void)

    3、方法参数的数量和类型(按声明顺序)

    4、方法的修饰符(public、private、protected、static、final、synchronized、native、abstract的某个子集)

    除上述清单列出的条目之外,如果某个方法不是抽象的和本地的,它还必须保存下列的信息:

    1、方法的字节码(bytecodes)

    2、操作数栈和该方法的栈帧中的局部变量区的大小

    3、异常表

  1.4类(静态)变量

  类变量是由所有实例共享的,但是即使没有任何类实例,它也可以被访问。这些变量只与类有关----而非 类的实例。因此它们总是作为类型信息的一部分而存储在方法区。

  而编译时常量(就是那些用final声明以及用编译时已知的值初始化的类变量)则和一般的类变量的处理方式不同,每个使用编译时常量的类型都会复制它的所有常量到自己的常量池中或嵌入到它的字节码流中。作为常量池或字节码流的一部分,编译时常量保存在方法区中----就和一般的类变量一样。

  1.5指向ClassLoader类的引用

  每个类型被装载的时候,虚拟机必须跟踪它是由启动类装载器还是由用户自定义类装载器装载的。如果是用户自定义类装载器的,那么虚拟机必须在类型信息中存储对该装载器的引用。

  虚拟机会在动态连接期间使用这个信息。当某个类型引用另一个类型的时候,虚拟请求装载发起引用类型的类装载器来装载被引用的类型。这个动态连接的过程,对于虚拟机分离命名空间的方式也是至关重要的。为了能够正确的执行动态连接以及维护多个命名空间,虚拟机需要在方法表中得知每个类都是由哪个类装载器装载的。

  1.6指向Class类的引用

  对于每个被装载的类型(不管是类还是接口),虚拟机都会相应的为它创建一个java.lang.Class类的实例,而且虚拟机还必须以某种方式把这个实例和存储在方法区中的类型数据关联起来。

  在你的Java程序中,你可以得到并使用指向Class对象的引用。Class类中一个静态方法可以让用户得到任何已装载的类的Class实例的引用。

  // A method declared in class java.lang.Class;

  public static Class forName(String classname);

  

  

日积月累——java虚拟机内存区域的划分的更多相关文章

  1. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

    一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...

  2. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  3. 总结Java虚拟机内存区域模型

    本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...

  4. 一文解析总结Java虚拟机内存区域模型

    最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...

  5. java虚拟机内存区域理解

    java虚拟机有的区域随着虚拟机进程的启动而存在, 有的区域依赖用户线程的启动和结束而建立和销毁. 程序计数器:为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器.(针对java方 ...

  6. Java虚拟机内存区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.以及创建和销毁的时间.有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结 ...

  7. Java虚拟机 内存区域划分

    (图片来自https://www.cnblogs.com/whgk/p/6138522.html) 先从线程私有区开始介绍 虚拟机栈 Java虚拟机栈是由一个个栈帧组成的,当一个方法被调用时,代表这个 ...

  8. Java虚拟机内存区域堆(heap)的管理

    在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域 ...

  9. 一、java虚拟机内存区域

    内存区域 java虚拟机在java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.java虚拟机规范将JVM管理的内存分为:程序计数器.本地方法栈.Java虚拟机栈.方法区.Java堆.如下 ...

随机推荐

  1. 自定义Cordova插件(基础篇)

    cordova自定义插件 注意:存放自定义cordova插件目录不能有空格可能会报错 cordova的安装 下载node.js,安装完成后你可以在命令行中使用node和npm. 安装cordova使用 ...

  2. NetSec2019 20165327 Exp1 PC平台逆向破解

    NetSec2019 20165327 Exp1 PC平台逆向破解 一.实践目标 本次实践的对象是一个名为pwn1(实验中用的 是5327pwnx)的linux可执行文件. 该程序正常执行流程是:ma ...

  3. Docker中安装elasticsearch6.7.1

    先拉取镜像  docker pull docker.elastic.co/elasticsearch/elasticsearch:6.7.1    然后创建容器 (这是一条长的命令!!!)  dock ...

  4. LVM方式安装Ubuntu 系统

    重装Ubuntu系统,使用LVM管理磁盘,最好不要使用默认的LVM安装方式,而应挂载U盘启动盘,进行物理磁盘分区,创建物理卷.卷组.虚卷(即创建LVM系列操作),在安装系统时将虚卷挂载到文件目录上.将 ...

  5. Git版本库管理

    Step 1 查看哪些历史提交过文件占用空间较大 使用以下命令可以查看占用空间最多的五个文件: git rev-list --objects --all | grep "$(git veri ...

  6. 【转】在Express项目中使用Handlebars模板引擎

    原文:http://fraserxu.me/2013/09/12/Using-Handlebarsjs-with-Expressjs/ 最近在用Expressjs做一个项目,前后端都用它来完成.自己之 ...

  7. 将VMware虚拟机系统镜像导入到ESXi vSphere

    原因: 公司有一个VMware虚拟机的交叉编译镜像,但主机性能不行,因此需要将镜像导入ESXi vSphere 过程: 1.将WMware虚拟机克隆; 2.将虚拟机的多个磁盘文件合并成一个;(否则vS ...

  8. maven加载springboot project

    maven加载springboot project   1● 下载项目 2● 构建project mvn install mvn package   3● idea加载 4● run启动   ==== ...

  9. python编程学习--Pygame - Python游戏编程入门(0)---转载

    原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...

  10. linux 查找指定进程并kill

    ps -ef | grep  php | grep -v 'grep' | awk '{print $2}'| xargs kill -9