JVM之一——对象的创建和内存分布

通俗易通解释SLAM问题的数学描述:运动方程和观测方程 高翔博士在他的《视觉SLAM十四讲》中把SLAM问题的数学描述抽象成了两个数学方程,以下对此做个总结,并且对此做一些通俗易懂的解释: 一、方程的总体形式 作为理性层次的描述,我们引入数学方程来描述SLAM过程,其中第一个方程叫做运动方程、第二个方程叫做观测方程,想象一下我们在研究SLAM的时候肯定需要观测机器人(无人汽车、无人机等都可以统称为机器人)的运动(画面感很强哈哈),这样很容易理解并且记忆这两个方程的名称和意义: 二、变量的含义 我们看到,这两个方程中有大量的英文字母作为变量存在其中,下面介绍一下 阅读详情


用简单通俗的话来记录自己对架构的理解

1.背景

对于android工程师,Dalvik、ART虚拟机是进阶必走之路,那么,这两种虚拟机也都是JVM,要了解它们,JVM的入门必不可少。

2.内容脑图

在这里插入图片描述
对于为啥学习、设计它的原因、JVM发展历史就不做具体的阐述,内存区域的详细讲解,参考:
https://blog.youkuaiyun.com/FullStackDeveloper/article/details/111412340?spm=1001.2014.3001.5501
这篇博客主要讲述JVM对象和JVM优化的相关技术。

3.JVM对象

1.JVM对象创建

让我来look一下,String s = new String(),这行代码简单的不简单了,但是,你如果完全认为简单,那就是to young to simple了,让我们来看看,它说经历的过程。
在这里插入图片描述

1.检查加载

大家还记的对象是怎么来的吗?究其本质,是由字节码文件创建的Class对象newInstance而来。那么字节码文件又是虚拟机加载进来,在加载的过程中,进行检查等流程。
类加载:
当需要使用某个类时,虚拟机将会加载它的".class"文件进入方法区,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程称为类加载。
在这里插入图片描述

2.分配内存

(1)分配方式
堆内存分配方式是由两种:
指针碰撞:适用于连续内存
空闲列表:适用于回收内存
(2)并发安全问题:
(a)CAS机制(Compare and Swap)
AS机制中使用了3个基本操作数: 内存地址V,旧的预期值A,要修改的新值B。更改赋值时和分配内存时的旧值做对比。
(b)本地线程分配缓存
其实就是逃逸技术,逃逸技术可参考

3.内存空间初始化

对象的成员进行内存分配初始化。

4.设置

对象包括hash,对象头等信息,用来垃圾回收的年龄计算等

5.对象初始化

对象的地址指向引用的成员变量

2.JVM对象内存分布

在这里插入图片描述

1.对象头

包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。
java的对象头由以下三部分组成:
1,Mark Word
Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。
Mark Word在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
2,指向类的指针
该指针在32位JVM中的长度是32bit,在64位JVM中长度是64bit。
Java对象的类数据保存在方法区。
3,数组长度(只有数组对象才有)

2.实例数据

各种成员变量和值。

3.对齐填充

因为JVM要求java的对象占的内存大小应该是8bit的倍数,所以后面有几个字节用于把对象的大小补齐至8bit的倍数,没有特别的功能。

3.JVM对象访问

大家可以看到方法区的对象型数据,实际上就是字节码对象。

1.句柄访问

在堆区有个句柄表,进行地址和指引的对应。
在这里插入图片描述

2.指针访问

栈区保存堆区各个对象的地址。现在的JVM使用的主流
在这里插入图片描述

4.JVM的逃逸技术

本质上就是分析对象的作用域范围。
举个例子:创建1个亿的Test对象,如果全部在堆区进行开辟的话,触发大量GC,所以,根据场景分析,在栈帧创建一个对象,从而实现更快,更节省的调用。

for(int i = 0 ;i<10000000;i++){
	Test test = new Test();
}

那么就有两个问题了。
1.对象一定在堆上么?
不一定,存在逃逸技术,就可能在栈上。
2.我如何验证这个生癖的技术?
对于HotJVM,只需要在设置项打开逃逸分析和本地缓存

-XX:+(-)DoEscapeAnalysis:启用逃逸分析(默认打开)
-XX:+(-)UseTLAB 本地线程分配缓冲(默认打开)
-XX:+(-)EliminateAllocations:标量替换(默认打开)
-XX:+(-)PrintGC 打开GC日志

不要问我安卓怎么校验,我也没想到如何实现!

5.站在巨人的肩膀

1.对象的创建及内存分布
https://developer.51cto.com/art/202104/659482.htm

永磁同步电机定子槽型设计实战:从梨形槽到矩形槽的NVH优化之路 本文深入探讨了永磁同步电机定子槽型设计在NVH优化中的关键作用,对比了梨形槽与矩形槽的性能差异。通过Ansys Maxwell仿真和实际案例,揭示了矩形槽在提升槽满率、降低电磁噪声方面的优势,并总结了五大设计黄金法则,为电机设计工程师提供了实用指导。 阅读详情

相关推荐

Unity海洋渲染实战:Ceto Ocean System核心原理与高级应用指南

实时水面渲染是计算机图形学中的重要课题,涉及波浪模拟、光照交互和着色器编程等核心技术。其原理通常基于物理模型,如使用Gerstner波模拟规则海浪,或通过快速傅里叶变换(FFT)处理频谱数据生成随机海面。这些技术的价值在于能以可控的性能开销,在游戏中实现具有体积感、反射和折射效果的真实水体。在开放世界、海战模拟等应用场景中,专业的海洋系统如Ceto Ocean System,通过模块化架构整合了波浪生成、动态网格和渲染管线,为开发者提供了完整的解决方案。本文深入探讨了其双引擎波浪系统和多层渲染结构,并分享了

weixin_29002595的博客 279

面试笔记——Java 对象如何在JVM中进行创建、分布和访问

一.对象的创建 1)类记载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程 2)分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有“指针碰撞”和“空闲列表”两种,选择哪种分配方式由 Java 堆是...

weixin_36898373的博客 320

Tesseract OCR识别不准?手把手教你用PyAutoGUI提升自动点击脚本的准确率

本文针对Tesseract OCR在屏幕自动化中识别不准的问题,提供了一套完整的优化方案。通过PyAutoGUI精准截图、结合PIL和OpenCV进行图像预处理(如灰度化、对比度增强、自适应二值化),并调优Tesseract参数(如PSM模式、白名单),显著提升文本识别准确率。文章还介绍了结合模板匹配、构建容错循环等进阶技巧,帮助开发者打造高可靠性的自动点击脚本。

weixin_29093017的博客 543

java类对象创建过程与jvm内存分布详解

最近在学习jvm和java对象创建过程遇到一个难题,在学习jvm时对于java类对象知识点理解不够透彻,在学习java类对象创建时对jvm不理解,在反复单独学习后将两者结合学习时,发现很多阻塞的点水到渠成的打开了

明白的民的博客 789

matinal:S4 HANA 详解ACDOCA与BSEG的区别都在这了

当你在Coding Block中添加自定义字段的时候

matinal 當冬夜漸暖 。公众号:matinal 4567

用Arduino和8个舵机,从零搭建一台能走路的并联腿机器狗(附完整代码与3D模型)

本文详细介绍了如何用Arduino和8个舵机从零搭建一台能走路的并联腿机器狗,包括硬件准备、结构组装、电路系统搭建、运动算法实现和Arduino编程。通过完整的代码与3D模型,帮助创客深入理解机器人运动原理,实现稳健行走的8自由度机器狗。

weixin_30482383的博客 700

JVM之内存和对象创建过程

1.5.3多核并行 Lambda支持会极大改善目前Java语言不适合函数式编程的现状.函数式编程的一个重要优点就是天然适合并行运行.   2.2.1程序计数器(每条线程独立私有)          程序计数器是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支 循环 跳转 异常处理 线...

gk 1万+

虚拟化Esxi 和 华为交换机--配置链路捆绑

在这种模式下,Eth-Trunk的建立和成员接口的加入都需要手工配置,没有LACP协议的参与。● 在没有配置802.3ad聚合时,启用基于IP哈希的路由将中断网络,因此必须先对虚拟交换机进行更改。再去修改交换机的链路聚合模式(交换机配置为手动模式的链路聚合)当服务器需要通过交换机从远端服务器获取配置文件后才可以启动链路聚合时,交换机的链路聚合口需要配置lacp force-forward。● 交换机必须设置手动模式的链路聚合,虚拟交换机的负载平衡方法必须设置为基于IP哈希的路由。

ling 2113

对象的创建及内存分布

下面简单总结一下对象的创建及其内存分布(以下只讨论普通Java对象,不包括数组和Class对象) 1.了解对象的内存分布 对象内存分配在堆中(绝大部分普通Java对象,像Class对象是分配在方法区中的) 对象开始的部分是对象头,包括两部分信息 第一部分是自身运行时数据,存放了跟对象有关的信息,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等 第二部

zz276203200的博客 1051

别再只盯着meta包了!盘点R语言中7个元分析工具包的特色与适用场景

本文深入评测了R语言中7个主流元分析工具包(meta、metafor、netmeta、mada、mvmeta、metasens、rmeta)的核心功能与适用场景,帮助研究者根据具体需求精准选型。通过对比表格和实际代码示例,详细解析了各工具包在传统两两比较、网络Meta分析、诊断准确性研究等不同场景下的差异化优势,并提供了性能对比和组合使用建议。

weixin_30736301的博客 296

农业无人机:无人机图像处理_(8).遥感图像处理与分析

遥感图像处理与分析在农业无人机技术中具有重要作用,通过图像预处理、特征提取、分类与分割、目标检测等技术,可以实现对农田的精细管理、作物监测、病虫害预测等应用。本节详细介绍了这些技术的基本概念、常用方法和具体实现,希望对您在农业无人机图像处理方面的学习和应用有所帮助。

zhubeibei168的博客 1335

详细理解JVM对对象的创建,内存分配及访问定位

前言 都说Java是基于对象编程,那么在本文我们主要探讨一下关于对象在Java虚拟机中的一些创建以及内存的布局。 1. 对象的创建 JVM创建对象可以用流程图简单表示: 在其中分配内存时牵涉到JVM对空间的分配策略,这取决于Java堆中内存是否规整,针对此JVM有两种不同的策略: 指针碰撞:在Java堆中内存如果是绝对规整的,被使用过的内存放在一边,空闲的放在另一边,中间放着一个指针作为分界指示器,分配内存就是把指针向空闲方向挪动一段与对象大小相等的距离。 空闲列表:如果 Java 堆内存不规整,虚拟机

cheng__yu的博客 288

嵌入式系统开发笔记96:将STM32CubeIDE设置为中文

本文介绍将STM32CubeIDE设置为中文的方法。

snmplink的博客 8534

深入理解JVM(二)----对象的内存分布和创建

对象的内存分布 hotspot虚拟机中,对象在内存中的布局可以分为三个区域,对象头、实例数据、对齐填充。 对象头 hotspot虚拟机的对象头包括两部分信息,一部分用于存储对象自身的运行时数据(被称为Mark Word),如hash码,GC分代年龄,锁状态标志,偏向线程ID,偏向时间戳等。这部分在32位和64位虚拟机(未开启压缩指针)中占32位和64位。虽然对象在运行时的数据很多,远远超过32或...

machine_Heaven的博客 276

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM底层原理篇四:硬件知识 MarkWord 对象在JVM中的定位 创建和内存分布

硬件知识: 存储器的层次结构: ○ L0:寄存器,速度为1个cpu时间单位,大概是十亿分之一秒 ○ L1:高速缓存,位于CPU核的内部,速度为3-4个cpu时间单位 ○ L2:高速缓存,位于CPU核的内部,速度为10个左右的cpu时间单位 ○ L3:高速缓存,位于CPU的内部,不在核的内部,CPU直接共享的缓存,速度为40-45个cpu时间单位 ○ L4:主存,CPU共享,速度大概是60-80纳秒 ○ L5:磁盘,CPU共享 ○ L6:远程文件存储 ○ 当CPU需要使用一个数据时,会从L1开

WindNolose的博客 1088

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JVM第一章 内存分布

内存分配流程

sdau20171934的博客 435

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JVM层面的JAVA类和实例(Klass-OOP)

在HotSpot中,KlassKlassOopDescOopDescJVM 使用 C++ 编写的,C++ 定义了2个类KlassOopDesc分别用来描述Java中类和对象, 所以Java中的类和对象对于C++而言,均是 C++ 创建的对象。类比注解和元注解。C++定义的Java类产生的对象就是元注解;Java代码产生的对象就是注解。1、 JAVA代码通过创建对象,图示{1};2、JVM会加载对应的class,解析生成Klass对象,图示{2}、{3};3、JVM更加加载的Klass对象,创建。

肢解生活,直达本质;凡所有相,皆是虚妄。 1198

jvm专题 之 内存模型

了解一下java内存模型

oneouto的博客 1176

jvm对象探究

jvm基础知识

m0_74347016的博客 435

Java面向对象——对象的内存原理和内存图

获取的就是002里面的name,还有002里面的age,通过s2去调用study,打印如下内容,study方法执行完毕,出栈,当study方法执行完毕之后,那你要想main方法是不是也执行完毕也要出去了呀?在内存当中是这样的,首先会去声明一个stu2的小空间,这个空间也能存student这个类对象的地址值,stu2记录的其实也就001,也能通过001也能找到堆内存的空间,两个变量都指向了同一个对象001。若Studet 类中的成员变量在定义时已经被赋值,此时堆中的成员变量的默认初始化的值将会被对应值覆盖。

weixin_55982502的博客 1038

对象的创建到死亡

JVM下的内存分布: 1.程序计数器:每一个线程都有一个程序计数器,执行java方法时,计数器存放着正在执行的虚拟机字节码指令的地址,执行Native方法时,计数器为空。 2.栈:线程私有,生命周期与线程的生命周期相同,内存空间在编译期完成分配,运行时不会改变。 3.堆:堆是被所有线程共享的一块内存,在虚拟机启动时创建,堆可以在物理上不连续,只要在逻辑上连续即可。 4.方法区:被所有线程共...

weixin_30751947的博客 129

面试官:JVM 这些我必问

JVM 内存分布 线程共享数据区:方法区->类信息,静态变量堆->数组对象 线程隔离区虚拟机栈-> 方法本地方法栈->本地方法库 native 堆、程序计数器 JVM 运行数据 程序计数器 线程隔离 ,比较小的内存空间,当前线程所执行的字节码的行号线程是一个独立的执行单元,由 CPU执行唯一没有 OOM 的地方,由虚拟机维护,所以不会出现 OOM 虚拟机栈 执行的是Java方法 方法的调用...

思考者浩哥 1063

画图理解JVM相关内容

而且,instanceKlass拥有class对象的指针,实例可以通过instanceKlass找到class对象,只是需要两次指针跳跃,所以上图绘制方式其实也并无太大问题。此外,在移动过程中,需要。在控制台上通过指令,查看不到最全面的信息,通过Tools->inspector创建可视化窗口,可以查看最全面的信息,具体如下。当需要进行内存清除时,操作异常容易,因为两个区间在同一时刻只有一个区间存在使用的对象,因此只需要。标记-复制算法,将内存划分为等大的两个空间,一个空间用于存放对象,另一个空间用于预留。

qq_62835094的博客 1374

从String s = new String(“abc“) 一共创建了几个对象简单认识JVM

在做一些面试题或者面试的时候,经常会碰到String s = new String("abc") 一共创建了几个对象这个问题,要先了解这个问题,首先我们得先知道jvm的内存。 在jdk1.8之前,jvm运行时数据区分布如下:其中方法区和堆内存是所有线程共享的,而程序计数器、虚拟机栈、本地方法栈是线程私有的。 其中对于方法区,大家常常称之为:“永久代(Permanent Generation)”,但是二者本质上并不相同。仅仅是因为习惯使用说使用永久代来实现方法区而已,这样HotSpot的垃圾收集器就可..

Android系统优化 3574

java中的对象 堆 new_java中new两个对象,在堆中开辟几个对象空间

Java 对象在堆中的内存结构翻译人员: 铁锚 翻译日期: 2013年11月8日 原文链接: What do Java objects look like in memory during run-time? 我们知道,函数每次 ...SQL中对于两个不同的表中的属性取差集except运算SQL中对两个集合取差集运算,使用except关键字,语法格式如下: SELECT column_name(...

weixin_36074271的博客 338

Java程序在内存中运行详解

Java语言是一门编译型语言,需要将编写的源代码(.java文件)编译之后(.class字节码文件),通过 jvm 才能正常的执行,下面的内容记录了一个程序从编写到执行整个过程在内存中是怎么一个变的。 一、JVM的内存分布 先了解下 JVM 的内存分布,因为Java程序想要运行,就要依靠 JVM,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM 实现了Java 的平台无关性,由此可见JVM的重要性。所以在学习 Java 内存分配原理的时候一定要牢记这一切都是在 JVM 中进行的,JVM 是内存

mingyuli的博客 2221
上一篇: 数据库设计之二——复合语句
下一篇: 垃圾回收器之一——深入理解对象存活算法
FullStackDeveloper
博客等级 码龄11年 23粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值