简要介绍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. 每天一个linux命令(6/18):lsof命令

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以,lsof的功 ...

  2. String和StringBuilder、StringBuffer

    Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder String 只读字符串,这里的只读并不是指String类型变量无法被修改,而是指String类 ...

  3. for循环执行流程

    语句格式: for(表达式1;表达式2;表达式3) { 循环体 } 表达式1:赋值表达式,用来给控制变量赋初值.(只执行一次) 表达式2:逻辑表达式,是循环的控制条件,用来判断控制变量是否符合循环条件 ...

  4. PhotoShopCs5启动 需要使用Adobe Application Manager 启动试用版

    解决办法:下载Application Manager 7.0 地址:http://download.adobe.com/pub/adobe/creativesuite/cs/win/Applicati ...

  5. linux上不能显示Jfreechart的图片文件

     出现错误: Jan 23, 2015 4:19:21 PM org.apache.catalina.core.StandardWrapperValve invokeSEVERE: Servlet.s ...

  6. SpringCloud-路由网关(Zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.只能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统. 在Spring Cloud ...

  7. php 当前时间计算操作

    首先要设置时间为中国时区 date_default_timezone_set('PRC'); 对于获取当前时间戳后的各种时间计算 数据库保存最好用时间戳 当前时间time() 上一天 echo dat ...

  8. 内核编译错误解答(elf_i386错误)

    内核编译错误解答(elf_i386错误) 在编译内核过程中遇到的问题及解决方法: 1.root@org:/usr/src/linux# make menuconfig  *** Unable to f ...

  9. 初探MyBatis之HelloWorld(一)

    官方地址:https://github.com/mybatis/mybatis-3 准备: 官方中文文档地址:http://www.mybatis.org/mybatis-3/zh/getting-s ...

  10. Zabbix的基本安装配置

    /////////////////下面开始我的表演///////////////// 1.安装zabbixyum install -y epel-release安装rpm包的LAMP环境: yum i ...