当前位置: 首页 > news >正文

Java存储区域——JVM札记lt;一个gt;

Java当虚拟机数据区域

执行数据区主要包括:方法区、堆、VM栈、本地方法栈、程序计数器。

当中方法区和栈是线程共享的区域,另外三块区域是每一个线程私有的区域。各个数据区的功能简单说明例如以下:

程序计数器:当前线程所运行的字节码的行号指示器。

虚拟机栈:描写叙述Java方法运行的内存模型——每个方法在运行的同一时候都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法从调用直至运行完毕的过程。就相应一个栈帧在虚拟机栈中入栈到出栈的过程。假设栈的深度大于虚拟机所同意的深度,将抛出StackOverflowError异常。假设栈扩展时无法申请到足够的内存,将抛出OutOfMemoryError异常(下述的本地方法栈类同)。

本地方法栈:与虚拟机栈的作用类似。虚拟机栈为Java方法服务,本地方法栈为Native方法服务。

Java堆:在虚拟机启动的时候创建。作用是存放对象实例。通过-Xmx和-Xms控制堆的大小。假设在堆中没有内存完毕实例分配,而且堆也无法再扩展时。将抛出OutOfMemoryError异常。

方法区:作用是存储已被虚拟机载入的类信息、常量、静态变量等(在HotSpot中称此区域为Permanent Generation)。




对象的创建

对象的创建包含四个步骤:类载入检查、为新生对象分配内存、初始化为零值、设置对象头。

一、类载入检查

虚拟机遇到一条new指令时,收件将检查该指令的參数能否在常量池(执行时常量池是方法区的一部分。

Class文件除了有类的版本号、字段、方法、接口等描写叙述信息外,另一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类载入后进入方法区的执行时常量池中存放。)中定位到一个类的符号引用,而且检查这个符号引用代表的类是否已被载入、解析和初始化过。

假设没有,那必须先执行对应的类载入过程。

二、为新生对象分配内存

对象所需内存大小在类载入完毕后便全然确定。则分配内存等同于把一块确定大小的内存从Java堆中划分开来。

分两种情况:Java堆中内存是绝对规整的(称为指针碰撞。Bump the pointer)、内存不规整(称为空暇列表。Free List)。在规整的Java堆中,用过的内存放一边,空暇的内存放一边。中间放一个指针作为分界点。在不规整的Java堆中,虚拟机维护一个列表记录哪些块是可用的。选择那种分配方式由Java堆是否规整决定。而Java堆是否规整由採用的垃圾收集器是否带有压缩整理功能决定。如:在使用Serial、ParNew等带Compact过程的收集器时,採用的分配算法是指针碰撞。而使用CMS基于Mark-Sweep算法的收集器时,採用空暇列表。

三、分配内存过程须要保证线程安全

对分配内存空间的动作进行同步处理。或者是把内存分配的动作依照线程划分在不同的空间进行(即本地线程分配缓冲Thread Local Allocation Buffer)。

四、对象头的设置

说明是哪个类的实例、怎样找到类的元数据信息、对象的哈希码、对象的GC年龄。


对象的訪问定位

Java程序通过栈上得reference数据操作堆上得详细对象。有两种訪问方式:使用句柄和直接指针。

一、使用句柄

reference中存储的是稳定的句柄地址。在对象实例数据被移动时(垃圾回收时)仅仅会改变句柄中的实例数据指针,而reference本身不须要改变。

二、使用直接指针

速度快,由于它节省了一次指针定位的时间开销。


说明:本文的内容參考书籍《深入理解Java虚准机(文章2版本)


版权声明:本文博客原创文章,博客,未经同意,不得转载。

相关文章:

  • memset函数详解
  • Migration workstation vms to openstack kvm
  • Scala学习笔记(1)-环境搭建
  • Android平台调用Web Service:螺纹的引入
  • sed去掉文件中的空行
  • 前端手札--meta标记篇
  • 小技巧:Windows Server 2012R2 WiFi 无法连接问题
  • 在项目中引入领域驱动设计的经验
  • 【零基础学习iOS开发】【02-C语言】11-函数的声明和定义
  • 树莓派 安装 php
  • 互联网架构设想的大型应用软件,并建议
  • Android软硬整合技术(HALFramework)
  • httpry 升级版本 secihttp 发布了
  • 认为最重要的是:不要说自己正在「创业」(转)
  • 第一章 词汇陷阱
  • @jsonView过滤属性
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • css的样式优先级
  • Js基础知识(四) - js运行原理与机制
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node和express搭建代理服务器(源码)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 蓝海存储开关机注意事项总结
  • 面试总结JavaScript篇
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ZT)一个美国文科博士的YardLife
  • (九)One-Wire总线-DS18B20
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)创业的注意事项
  • .net core 6 redis操作类
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .sh
  • /bin/bash^M: bad interpreter: No such file or directory
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @Mapper作用
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ vulhub漏洞复现篇 ] Jetty WEB-INF 文件读取复现CVE-2021-34429
  • [1127]图形打印 sdutOJ
  • [AIGC] Kong:一个强大的 API 网关和服务平台
  • [AIGC] 如何建立和优化你的工作流?
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [Contest20180313]灵大会议
  • [echarts] y轴不显示0
  • [Git 1]基本操作与协同开发
  • [JavaScript] JavaScript事件注册,事件委托,冒泡,捕获,事件流
  • [js]js设计模式小结