简要介绍Java的内存区域:

  • 运行时数据区域
  • HotSpot虚拟机对象

一、概览

二、运行时数据区域

2.1 程序计数器

Program Counter Register,代表当前线程所执行的字节码的行号指示器,操作系统中的PC,这两个是一个概念。执行时就是通过改变这个计数器来选取下一条需要执行的字节码指令。Java支持多线程,所以每个线程有自己独享的PC,类似于操作系统线程表中的一个属性。

2.2 Java虚拟机栈

和PC一样,是线程私有的,和线程的生命周期一样。虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的时候都会创建一个栈桢(Stack frame),用与存储局部变量,操作数、动态链接、方法出口等信息。局部变量放在栈中的局部变量表中,该表中存放了编译器可知的基本数据类型(int。float,string。。)和对象的引用(reference)。

2.3 本地方法栈

Native Method Stack与Java虚拟机栈的作用非常相似,不过用于为虚拟机调用到的Native方法服务。

2.4 Java堆

Java堆被所有线程所共享,是Java程序的内存,在虚拟机启动时创建,该内存区域的目的就是存放对象实例。Java堆是垃圾回收器(GC)管理的主要区域。

2.5 方法区

Method Area各个线程共享的区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,

方法区内有一块特殊的区域叫运行时常量池(Runtime Constant Pool),用于存放编译时生成的各种字面量和符号引用(字符串)

2.6 直接内存

直接内存不是虚拟机运行时的一部分,但是会影响到Java堆的大小

三、HOTSPOT中虚拟机对象

3.1 对象的创建

Java是一门面向对象语言,对象的创建是通过new关键字来完成的。主要步骤:

  1. 先去方法区检查类是否被加载
  2. 没有加载则先加载类到方法区
  3. 为对象分配内存(类被加载后所需要的空间是已知的)
  4. 分配内存并发控制(仿制同一块内存被分配给多个对象)
  5. 将所分配的内存空间初始化为0
  6. 将对象的基本信息(属于那个类,对象哈希码,GC代领等)放在对象头中(Object Header)
  7. 至此新对象已经产生
  8. 调用Init方法,对对象的属性按照程序员的想法进行赋值

3.2 对象内存布局

对象在内存中主要分三块:

  1. 对象头(Header):第一部分存储对象自身的数据,如哈希码,GC代龄等,另外一部分是类型指针,虚拟机通过这个指针来确定这个对象是那个类的实例
  2. 实例数据(Instance Data):对象真正存储的有效信息,程序代码中定义的各种字段的内容,父类中定义的也会被继承下来。
  3. 对齐填充(Padding):没有特殊意义,占位符,对象的大小必须是8字节的整数倍。

3.3 对象的访问定位

建立对象是为了使用对象,java程序需要通过存储在栈上的reference数据来操作对上的具体对象,reference类型是一个指向对象的引用,并没有定义这个歌引用该通过何种方式去定位、访问堆中对象的具体位置,所以对象访问方式也是取决于虚拟机的实现方式而定,目前主流有两种:

  1. 使用句柄访问对象

  

  使用句柄的好处是句柄稳定,当对象被移动(GC后)时只改变句柄中的实例数据指针,而Reference本事不需要修改。

  2. 使用指针访问对象

  

  使用直接指针的最大好处就是速度更快,节省了一次指针定位的时间开销。

Java 虚拟机-Java内存区域的更多相关文章

  1. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  2. 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))

    java虚拟机的内存区域分配   在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...

  3. Java虚拟机之内存区域

    原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...

  4. Java虚拟机各内存区域的位置及功能的介绍

    Java虚拟机运行时数据区: 相关区域介绍: 程序计数器: 功能:当前线程所执行字节码的行号指示器.若是Java方法记录指令地址,若为Native方法,则不记录 隔离性:线程隔离 Error:无 Ja ...

  5. 深入理解Java虚拟机02--Java内存区域与内存溢出异常

    一.概述 我们在进行 Java 开发的时候,很少关心 Java 的内存分配等等,因为这些活都让 JVM 给我们做了.不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用. ...

  6. Java虚拟机------JVM内存区域

    JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...

  7. 深入Java虚拟机之内存区域与内存溢出

    一.内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方 ...

  8. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  9. 深入理解java虚拟机【内存溢出实例】

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

  10. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

随机推荐

  1. python之使用__future__(解决版本不同,不兼容问题)

    Python的新版本会引入新的功能,但是,实际上这些功能在上一个老版本中就已经存在了.要“试用”某一新的特性,就可以通过导入__future__模块的某些功能来实现. 例如,Python 2.7的整数 ...

  2. 【Flask】Sqlalchemy 外键

    ### 外键:使用SQLAlchemy创建外键非常简单.在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了.从表中外键的字段,必须和父表的主键字段类型保持一致.示例代码如下: from ...

  3. java多线程下载文件和断点下载

    多线程,断点下载文件 import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; impor ...

  4. ubuntu 忘记root密码

    Ubuntu14.04系统中,因为误操作导致管理员密码丢失或无效,并且忘记root密码,此时无法进行任何root/sudo权限操作.可以通过GRUB重新设置root密码,并恢复管理员账户到正常状态. ...

  5. Java中的UDP协议编程

    一. UDP协议定义   UDP协议的全称是用户数据报,在网络中它与TCP协议一样用于处理数据包.在OSI模型中,在第四层——传输层,处于IP协议的上一层.UDP有不提供数据报分组.组装和不能对数据包 ...

  6. Yii框架和Vue的完美结合完成前后端分离项目

    背景说明 本文假设你对Yii和Vue都比较熟悉,至少都在项目里用过,另外笔者新人,以后不定时放一些干货,欢迎程序媛关注 Yii是一个PHP全端框架,典型的mvc的项目结构,后端接口都是一个控制器里放了 ...

  7. 【P2014】选课(树状DP)

    蒟蒻的第二道树形DP,话说看了这个题的正常做法之后一脸蒙,森林转二叉树??什么诡异的操作,蒟蒻完全没明白那个原理是啥...可能是当初没好好学吧..不管了,索性直接DP. 不难看出,这个题的DP方程和刚 ...

  8. 简学Python第五章__模块介绍,常用内置模块

    Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群  群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...

  9. QT QDialog如何弹出一个子窗口

    1. 假设已有一个QDialog的父窗口, 想弹出的子窗口为自己实现的myDialog : QDialog. myDialog 设计和平常的QDialog一样, childDialog : publi ...

  10. JMeter参数文件的相对路径

    很多教程里都说“尽可能将参数文件配置为相对路径,以更好的去适配Slave环境”或者“把XX放到相对路径” 这里相对路径是指的 C:\Program Files (x86)\apache-jmeter- ...