Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如图:

1.程序计数器

可以看作是当前线程所执行的字节码的行号指示器,通俗的讲就是用来指示执行哪条指令的。为了线程切换后能恢复到正确的执行位置

Java多线程是通过线程轮流切换并分配处理器执行的,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器

所以程序计数器是线程私有的

2.Java虚拟机栈

虚拟机栈描述的Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧

栈帧包括:局部变量表、操作数栈、动态链接和返回地址

待补充。。。

线程私有

3.本地方法栈

Java虚拟机栈是对应Java方法;本地方法栈对应Native方法

线程私有

4.Java堆

存放对象实例

是垃圾收集器管理的主要区域

线程共享

5.方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码

运行时常量池--用于存放编译器生成的各种字面量和符号引用

线程共享

对象创建

虚拟机遇到一条new指定时,首先检查指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用待代表的类是否已被加载、解析和初始化过,

如果没有,要先执行类加载过程

类加载完后,虚拟机为新生对象分配内存,对象内存的大小在类加载完后便可完全确认

为对象分配内存相当于把Java堆中划分一块出来

在并发情况下,划分内存不是线程安全的,有2种解决方案:

1.对划分内存操作进行同步处理

2.每个线程在Java堆中预先分配一块内存--本地线程分配缓存TALB,只有在TALB用完并分配新的TALB时,才需要同步锁定

内存分配完成后,虚拟机将分配的内存空间都初始化为零值--这一步操作保证了对象实例字段在Java代码中可以不赋初始值就直接使用

自此,虚拟机就创建完一个新的对象了

简洁创建过程:类加载-->分配内存-->把内存空间初始化为零值

对象的内存布局

对象在内存中存储布局分为3块区域---对象头、实例数据、对齐填充

对象头:

1.存储对象自身的运行时数据---哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等

2.类型指针---对象指向它的类元数据的指针(并非所有JVM)

3.如果对象是数组,对象头还存储用于记录数组长度的数据

实例数据:

程序代码中所定义的各种类型的字段内容

对齐填充:

占位符,无特别含义

对象的访问定位

Java程序通过栈上的reference数据来操作堆上的具体对象;reference是一个指向对象的引用。

具体访问方式有2中---句柄、直接指针

句柄:

Java堆中划分出一块内存来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象的实例数据和类型数据各自的具体地址

好处:稳定,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要改变

坏处:开销大,每次都要2次指针定位

直接指针:

Java堆对象的布局中存有访问类型数据的相关信息,reference中直接存储对象的地址

好处:速度快,主要用这种

以上都是针对主流虚拟机Sun HotSpot而言!

java jvm内存地址_JVM--Java内存区域相关推荐

  1. java 64位 默认分配内存大小_JVM默认内存大小

    堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在Java虚拟机启动时创建的." ...

  2. bat java 指定堆大小_jvm 堆内存 栈内存 大小设置 查看堆大小

    1.在eclipse设置JVM参数 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效,也就是在eclipse中运行的java程序)编辑当前使用的J ...

  3. jvm内存模型_JVM|02内存模型

    JVM内存模型 概述 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保 ...

  4. java jvm 加载_Jvm是如何加载Java类的?

    前言 我们知道Java语言的类型可以分为两大类:基本类型「primitive types」和引用类型「reference types」. 对于Java的基本数据类型是Java虚拟机定义好的.至于另一大 ...

  5. 内存溢出_JVM|03内存溢出实战

    实战 内存溢出定位与分析 环境搭建 /** * 模拟测试插入一百万条字符串[image.png](https://img.hacpai.com/file/2019/08/image-dd10de62. ...

  6. 32位计算机中内存地址如何表示,内存地址是什么

    所谓的内存地址,指的就是在计算机系统中或移动智能设备如智能手机中运行内存的位置,在计算机界,我们通常以十六进制的方式表示这个特殊的内存地址,并称之为内存地址编号.在汇编语言中,内存地址编号经常会被使用 ...

  7. java xms xmx 设置_JVM 堆内存设置 -Xmx -Xms

    在Tomcat的启动参数里可以设置,如下 参数说明: -Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定: -Xmx 此设置控制 Jav ...

  8. 【java】java JVM如何科学的设置内存参数 虚拟机调优案例

    1.概述 本文章是视频:[面试绝招]BAT大厂高并发系统JVM性能调优实战 主要是这个说的比较科学.我以前都是测试或者按照经验来设置. 假设一个网站是日活500万,然后付费转化率是10%,日均50万, ...

  9. java jvm对象_【Java】JVM

    在 HotSpot 虚拟机中,一个对象在内存中存储的布局可以分为三块区域:对象头(Object Header).实例数据(Instance Data)和对齐填充(Padding). 当我们在 Java ...

  10. java题excel地址,(Java实现)蓝桥杯Excel地址

    历届试题 Excel地址 原题地址 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 Excel单元格的地址表示很有趣,它使用字母来表示列号. 比如, A表示第1列, B表示第2列, ...

最新文章

  1. Android Telephony分析(二) ---- RegistrantList详解
  2. 【译】canvas笔触魔法师
  3. 多线程编程(4) - 多线程同步之 Mutex (互斥对象)
  4. 技术总监谈好的程序员如何写代码
  5. transact-sql_如何使用Transact-SQL创建,配置和删除SQL Server链接服务器
  6. 机器学习之支持向量机算法(一)
  7. shell fork 阻塞进程_张三同学没答好「进程间通信」,被面试官挂了....
  8. 【特征提取】基于matlab基音周期估计【含Matlab源码 551期】
  9. Java版扫雷小游戏
  10. CE教程步骤8操作指南
  11. Android Scroller 滑动机制
  12. 分库分表之MyCat应用
  13. osworkflow教程
  14. XLSX转换为DOCX,Aspose.Cells快速搞定
  15. Velocity最简易的Servlet加载
  16. 免费好用的IPv6之一个有趣的需求——浅谈Openwrt的VLAN
  17. 探讨一下如何防止撞库。
  18. excel单元格内加空格_怎样在excel的单元格中的一列数字间添加两空格?
  19. javaScriot
  20. 企业级音视频会议实战之webrtc服务器janus品尝实战

热门文章

  1. 获取当天日期、昨天日期
  2. Hadoop集群安装部署_伪分布式集群安装_01
  3. RabbitMQ 管控台配置导入导出和重要性
  4. 通用mapper 如何处理多表条件查询通过list封装(一对多)
  5. Linux6、7 系列 安装、卸载mysql
  6. git Could not read from remote repository.Please make sure you have the correct access rights.
  7. qt中在QMultiMap中删除自定义数据类的元素
  8. 判断两个链表是否相交,若相交,求交点。(假设链表可能带环)【升级版】(C语言)
  9. php程序访问mysql数据实现查询_PHP+MySql实现后台数据的读取
  10. 清华大学python镜像_使用清华开源镜像安装tensorflow