创建对象对应的jvm内存图(二)

JVM 内存、JMM内存与集群机器节点内存的联系 本文深入解析了JVM内存模型与操作系统内存的关联机制。JVM内存由操作系统管理,其堆、方法区、栈等结构对应操作系统的不同内存区域。JMM模型定义了多线程下的内存可见性规则,主内存包含堆和方法区,线程通过工作内存交互。文章详细对比了物理内存、虚拟内存与Swap机制,并给出集群和容器环境下的内存配置建议:JVM堆内存应预留30%空间,避免Swap导致的性能问题。最后总结了常见OOM问题的解决方案,为Java应用的内存分配提供实践指导。 阅读详情

引用和对象的区别

引用和对象怎么区分?
"引用"是啥? 是存储对象内存地址的一个变量。
"对象"是啥? 堆内存中new出来的

简单说:
只要这个变量中保存的是一个对象的内存地址,那么这个变量就叫做"引用"

思考: 引用一定是局部变量吗?
不一定,成员变量也可以是一个引用

举例说明:


public class User{
    //类 = 属性+ 方法
    //以下3个都是属性,都是实例变量(对象变量)
    //用户id
    //访问id不能这样 User.id(这是错误的,实例变量不能用类名访问。)
    //id的访问必须先造对象,然后对象有了,才能访问对象的id
    int id;//成员变量又叫做实例变量
    //用户名
    String username;

    //住址
    //Address  是一个引用数据类型
    //addr是成员变量并且还是一个实例变量
    /addr是一个引用
    Address addr;
}
public class Address1{

    //城市
    String city;
    //编码
    String street;
    //邮政编码
    String zipcode;
}
public class TestClass {
    public static void main(String[] args) {
        Address  a = new Address();
        a.city ="beijing";
        a.street ="daxing";
        a.zipcode = "12132143";
        //用户对象
        User u = new User();
        System.out.println(u.id);//0
        System.out.println(u.username);//null
        System.out.println(u.addr); //null
        u.id = 12324;
        u.username ="zhangsan";
        u.addr = a;
        //输出zhangsan他是哪个城市的
        System.out.println(u.username + "是"+u.addr.city+"城市的");
        //拆分成以下代码和上面效果完全一样,原理一样,不同的是代码多了两个变量
//        Address ad = u.addr;
//        String  zhuzhi = ad.city;
//        System.out.println(zhuzhi);
        
    }
}

内存图如下

难度较大的内存图

重点突破

        int    x=100;

= 代表赋值运算,“赋值"中有一个"值”
x变量中的值是100。将100复制一份给y

        int y = x;

x表示:将x变量中保存的值100复制一份给y

对照图片尝试理解下面

        Address k = new Address(); //Address k =0x12132
        Address m = k;  //这里表示将k变量中保存的0x12132复制一份传给了m

尝试画这个代码的图

public class T{
    A a;

    public static void main(String[] args) {
        D d =new D();
        C c =  new C();
        B b= new B();
        A a = new A();
        T t = new T();

        c.d =d;
        b.c = c;
        a.b =b;
        t.a =a;
        //编写程序代码通过t来访问d中的i
//        D t.a.b.c.d = d;
        System.out.println(t.a.b.c.d.i);

        d.i =20;
        System.out.println(t.a.b.c.d.i);

        D d1 = t.a.b.c.d ;
        System.out.println(d1.i);
        d1.i =30;
        System.out.println(d.i);

    }

}
class A {
    B b;
}

class B {
    C c;
}
class C {
    D d;
}
class D {
    int  i;
}
Java对象内存图 介绍了java对象内存图,还有this的内存原理等 阅读详情

相关推荐

JVM 二 JVM内存模型

JVM内存模型 是指 Java 虚拟机在运行时使用的内存结构和分配方式。JVM 将内存划分为多个不同的区域,每个区域负责不同的任务。理解这些内存区域和它们的作用有助于我们优化 Java 应用程序的性能,特别是在高并发和大数据处理时。JVM内存模型可以大致分为以下几个主要区域:作用:堆内存用于存储应用程序的对象和数组,是 JVM 中最大的一块内存区域。几乎所有的 Java 对象都在堆上分配内存。堆内存的大小直接影响垃圾回收(GC)的频率和效率。划分:堆内存调优:作用:每个线程在执行时都会创建一个虚拟机栈,用于

空 901

创建对象对应的jvm内存图(一)

为什么要画内存图? 有了内存图,程序不运行,我也知道结果(可以推荐出结果) 有了内存图,有助于你调试程序。 画内存图是对java运行机制的一种理解,不知道运行机制,以后复杂的程序出现错误后,不会调试,调也不明白 画内存图注意事项 在内存图上不要体现出代码,内存上应该主要体现"数据" 画图的时候,图上的图形应该有先后顺序,先画什么,再画什么,必须是有顺序的,而不是 想起来什么就画什么,想起哪个...

Piepis的博客 463

ROS阿克曼小车避坑指南:TEB Local Planner参数调优实战(附完整配置文件)

本文针对ROS阿克曼底盘机器人,提供了TEB Local Planner参数调优的实战指南。文章深入剖析了阿克曼模型与TEB的协同工作原理,重点讲解了`min_turning_radius`、`cmd_angle_instead_rotvel`等关键参数的设置与调试方法,并分享了性能优化、避障行为调整的实用技巧,旨在帮助开发者避开常见陷阱,实现小车在复杂环境中的稳定、高效导航。

ik6789012的博客 500

JVM之内存和对象创建过程

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

gk 1万+

QGIS v3.28 高效加载OSM在线地图的三种实用方法

本文详细介绍了在QGIS v3.28中高效加载OSM在线地图的三种实用方法:通过XYZ Tiles直接连接、使用QuickMapServices插件以及配置WMS/WTMS服务。针对每种方法提供了具体操作步骤、常见问题解决方案和性能优化建议,帮助用户根据需求选择最适合的方案,提升GIS工作效率。

weixin_29233333的博客 434

【理解机器学习算法】之岭回归Ridge - L2 Rgularization

本人就职海外从事人工智能领域开发设计。 希望花时间总结下流行的机器学习算法,希望大家一起学习,欢迎指正!

Hyman Qiu 2317

深入理解Java中的String

一、String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for charact...

weixin_34117211的博客 1922

RocketMQ 5.3.1 集成 Spring Boot 3.4.3 就这么简单

RocketMQ 是一个分布式消息中间件,支持发布/订阅模型,具有高吞吐量、高可用性和事务消息等特性。它广泛应用于日志处理、订单系统和异步任务等场景。Spring Boot 3.4.3 集成 RocketMQ 5.3.1 的过程异常简单,仅需少量配置即可实现消息的生产和消费。本文从环境搭建到代码实现,覆盖了核心步骤。

lssffy的博客 1385

深入内存分析String对象的创建过程

String:不可更改的Unicode字符序列。 ci

代码人生 909

15、SQL Server查询优化与CPU负载管理

本文深入探讨了SQL Server查询优化与CPU负载管理的关键技术,包括强制连接类型的使用、键查找问题的解决、索引设计的最佳实践、高CPU负载的排查与优化,以及并行性的利弊与调整策略。通过优化查询逻辑、合理设计索引、监控与管理CPU资源,可以显著提升SQL Server的性能和稳定性。适用于数据库开发人员和DBA进行性能调优参考。

pz8901234的博客 78

013 PID参数整定:Ziegler-Nichols法

几年前在调试一台伺服压机,客户要求位置精度±0.01mm,响应时间小于50ms。我按照教科书上的经验值设了P=1.5,I=0.02,D=0.01,结果电机一启动就开始尖叫,位置超调直接干到0.3mm,然后开始震荡,像极了喝醉的舞者。现场工程师看我的眼神,就像在看一个刚毕业的实习生。那次之后我明白了一个道理:PID参数不是靠猜的,也不是靠经验公式硬套的。你需要一个系统的方法,而Ziegler-Nichols法就是那个让你从“瞎调”走向“有章可循”的起点。

m0_50546716的博客 101

java之创建String对象的两种方式及内存图解

视频地址: java之创建String对象的两种方式及内存图解 更多精彩内容,敬请扫码关注(HelloWorld小码农):  

HelloWorld小码农的博客 1285

开源免费!ReaLTaiizor如何用MIT许可证打造专业级WinForm UI?

摘要: ReaLTaiizor是一款开源UI控件库,为WinForm应用提供现代化界面解决方案。支持100+组件、多主题切换(浅色/深色/自定义)和.NET 4.8-8.0全版本兼容,MIT许可证允许免费商用。通过NuGet快速安装,3步改造传统界面:1)注入主题(如this.Theme = new Dark()),2)替换原生控件为高颜值组件(如ModernGrid替代DataGridView),3)集成高级功能(分页/动画提示)。典型场景包括登录界面美化(进度动画+通知控件)和数据表格Material风

墨夶的博客 1521

JVM内存结构详解

文章目录一、你了解JVM内存模型吗在这之前需要知道JVM内存模型图——JDK1.81.1、程序计数器1.2、Java虚拟机栈(Stack)1.1.1、java.lang.StackOverflowError问题1.3、本地方法栈1.4、元空间(MetaSpace)1.4.1、MetaSpace相比PermGen的优势1.5、Java堆(Heap)二、JVM三大性能调优参数 -Xms -Xmx -X...

不学习如何码遍天下 1万+

人体分割笔记总结

人体分割 人体分割(human parsing),属于语义分割任务的子任务,旨在对人类图像进行像素级的是细粒度分割(例如,划分出身体部位和服装)。根据不同的场景,又可以分为单人人体解析(single-person human parsing)和多人人体解析(multi-person human parsing,或者 instance-level human parsing)。除此之外,按照处理媒介分类,还可以分为基于图像的人体解析和基于视频的人体解析。 对于人体解析任务,常用的度量指标包括 Pixel a

jacke121的专栏 4255

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

weixin_55982502的博客 1038

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM内存是对应到操作系统内存

根据上面两个图可以看出,JVM内存模型是模仿操作系统内存模型构建的,JVM内存模型和操作系统内存模型是可以一一对应起来的,整个JVM内存模型存储在操作系统的堆中。JVM就是个操作系统,而JVM的方法区,也就相当于操作系统/主机的硬盘区,也叫永久区;而操作系统栈(本地方法栈)和JVM的栈也是一致的,无论是生长方向还是管理方式;JVM堆和操作系统堆在概念上和目标上是一致的,分配内存的方式也是一致的,但JVM堆管理垃圾的方式是GC回收,而操作系统堆则是需要程序员手动释放;至于PC寄存器,无论是在虚拟...

qq_41088031的博客 1989

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JVM创建对象与内存分配机制深度剖析

一般对象先被分配在 Eden,Eden 满了之后触发 Minor GC,此时把 Eden 区垃圾对象回收,剩余存活对象挪到空的 survivor。对象可以被分配到栈上,并可以被进一步分解时,JVM 不会创建对象,而是把对象的成员变量存入栈中,这些成员上会有一个标识表示它属于哪个类。逃逸分析:分析对象的动态作用域,如果这个对象只在一个方法中使用,其余方法不会引用这个对象,说明这个对象可以存放到栈中。JVM 中的对象一般都是在堆上进行分配的,但是当对象不是很大,也可以为对象在栈上分配内存。

javazhangwy的博客 1244

JVM创建对象之内存解析

JVM自学指南已经整理到我的GitHub开源项目: [JVM自学指南] 对象的实例化内存布局与访问定位+直接内存 一、对象的实例化 1、创建对象的方式 new 最常见的方式 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法 Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInstance(Xxx):反射的方式,可以调用空参、带参的构造器,权限没有要求 使用clone() :

weixin_44028058的博客 257

Java 创建对象过程 & JVM 内存分配并发安全笔记

Java对象创建过程详解:1)类加载检查确保类已加载;2)内存分配采用指针碰撞或空闲列表策略,并使用CAS/TLAB保证并发安全;3)初始化包括空间清零、设置对象头和调用构造方法。对象内存结构包含对象头、实例数据和对齐填充。JVM通过逃逸分析优化可能将对象分配在栈上。常见创建方式包括new、反射和clone等,各具特点。面试常考察创建步骤、并发安全机制和分配位置优化等核心问题。

笑衬人心的博客 1212

jvm系列(二):JVM内存结构

JVM内存结构   所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能问题,那么这些问题就会变的非常常见,了解JVM内存也是为了服务器出现性能问题的时候可以快速的了解那块的内存区域出现问题,以便于快速的解决生产故障。   先看一张图,这张图能很清晰的说明JV

纯洁的微笑 2493

Jvm 系列(二):Jvm 内存结构

局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过-Xmx和-Xms控制)。

smart_an的专栏 1221

jvm优化(二)JVM 内存大小设置

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。 一、Java JVM内存介绍 JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是

m0_67402823的博客 2945

一图解千愁,jvm内存从来没有这么简单过!

原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。看到这张图的同学,千万不要到处分享。我们仅限于小范围讨论,因为这张图威力很大,是我花了10年时间才画出来的!了...

小姐姐味道 1247

JVM创建对象

目录一、JVM对象创建的过程1、创建对象的过程①、类加载检查②、分配内存Ⅰ、如何分配内存?Ⅱ、如何防止并发状态下指针被同时调用的问题?③、初始化④、设置对象头⑤、执行init方法2、堆内存中存储的对象实例是什么样的结构?3、对象指针压缩①、为什么要进行指针压缩?②、如何禁用指针压缩 ?二、JVM对象的内存分配1、2、3、 一、JVM对象创建的过程 1、创建对象的过程 ①、类加载检查 判断有无加载过该类,有则直接进入下一步、没有则加载类对象。 ②、分配内存 分配内存主要有两个问题: Ⅰ、如何分配内存?

qq_42697271的博客 632

二、JVM内存模型及内存参数设置

二、JVM内存模型 1、Java语言跨平台特性 java程序主要通过JVM来实现跨平台的,JVM编译器将Java源代码文件编译成字节码文件(一次编译,随处运行),然后不同的操作系统生成的机器码不同,但是JVM运行是相同的,JVM解释器将字节码文件转换为机器可执行的二进制机器码 2、JVM内存模型 jvm包含两个子系统为类装载子系统和字节码执行引擎。两个组件为运行时数据区和本地接口。 类装载子系统:根据给定的全限定名类名(如:java.lang.Object来装载Class文件到Runtimedat

一名蒟蒻的博客 1655
上一篇: 创建对象对应的jvm内存图(一)
下一篇: 学习java中空指针异常
piepis
博客等级 码龄10年 104粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piepis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值