Java之对象内存分析
相信大家有时候在读代码的时候应该都会有以下情况:
- 这个对象本定义在上面,乱跑什么?怎么又到下面去了?
- 欸?我明明改变了这个对象的值,怎么没变呢?
要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要对其内存的状况要有些了解。
在java中,类是属于引用数据类型,而引用数据类型最大的难点在于数据的内存管理,在操作过程中内存的变化会比较多。
在用以上代码内存分析之前,先来了解两种常见内存划分
- 堆内存:保存对象的具体信息。堆内存通过关键字new来开辟空间。
- 栈内存:保存的是所指堆内存的地址。再通过堆内存找到对象的信息。
(栈就相当于客栈嘛,找到客栈具体地址,就能找到客栈主人。便于理解)
画个图更直观的了解一下
来看一段简单代码:
class Person{ //定一个“个人”类
String name;//人的姓名
int age; //人的年龄
public void tell(){
System.out.println("姓名:"+name+" 年龄:"+age);
}
}
class Test{
public static void main(String []args){
Person per = new Person();//创建一个对象
per.name = "小明";//该对象姓名
per.age = 18;//该对象年龄
per.tell();
}
}
这个是一个简单的java类,运行结果如下:
还是用图来解释:
对于Person per = new Person();这句话中,关键字new是用来开辟一个新的堆内存来存放数据,这里我们目前还没有放数据,所以所定义的属性首先保持默认值。
紧接着per.name = "小明"; per.age = 18;
这两句就是把所设置的数据放入堆内存。
我们在【Java面向对象修习之路 第一节】什么是对象中“通过类声明一个对象”可知道实例化对象是有两种方法。在上面的的代码中属于第一种情况:声明并实例化
第二种情况是分布进行,所以实例化的代码将会变成:
Person per = null;//先声明
per = new Person();//后实例化
然后赋值语句一样
注意!!!
所有对象在调用类的属性和方法都必须在完成实例化之后,若 没有 进行实例化,则会出先以下报错:
其中NullPointerException是无实例化的意思。这个问题是指创建一个堆内存所出现,并且此问题只会出现在引用对象类型。
内存问题会导致很多问题的出现,想要读懂代码,学会内存分析是第一步,下一步是引用分析。
引用分析会在下一节来分享,感谢观看。
Java之对象内存分析的更多相关文章
- Java常见对象内存分析
首先要明确Java内存的个位置上放的是啥 类.对象.实例三者的关系: 1.类:是对象的模板,可以实例化对象.(this不能出现在静态方法中) 2.对象:类的个体. 3.实例:实现的对象. 4.对应的引 ...
- Java面向对象_对象内存分析—值传递和引用传递
对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者 ...
- 【Java线程与内存分析工具】VisualVM与MAT简明教程
目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...
- Java单个对象内存布局.md
我们在如何获取一个Java对象所占内存大小的文章中写了一个获取Java对象所占内存大小的工具类(ObjectSizeFetcher),那么接下来,我们使用这个工具类来看一下Java中各种类型的对象所占 ...
- java执行程序的内存分析系列专栏
近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...
- java执行程序的内存分析系列专栏二之static变量和方法内存分析
昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...
- String对象内存分析
Java中内存分析: 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中). 堆(heap): ...
- Java内置内存分析
Java内存分析 package com.chao.reflection; public class Test05 { public static void main(String[] args) { ...
- JProfiler进行Java运行时内存分析
原文地址:https://www.cnblogs.com/onmyway20xx/p/3963735.html 在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析 ...
- JAVA 对象内存分析
1.jmap -heap pid 或者 jmap -histo pid 2.jmap -dump:file=folder/dumpFileName.txt,format=b pid 3.对3的输出文件 ...
随机推荐
- Nginx TCP 负载均衡:stream 模块配置
工作上遇到需要用nginx做负载均衡,参考了前同事留下的作业顺利搞定,感觉这块很有意义写篇文档记录. 参考:nginx tcp负载均衡(Stream模块)配置说明 参考:利用nginx进行TCP负载均 ...
- 与AI对话 -- 20230215 -- linux 启动参数与控制台
linux 启动参数 console=ttyS0,115200n8 console=tty0 说明 console=ttyS0,115200n8:指定系统使用 ttyS0(ttyS1.ttyS2 以此 ...
- 升讯威在线客服系统是如何实现对 IE8 完全完美支持的(怎样从 WebSocket 降级到 Http)【干货】
简介 升讯威在线客服与营销系统是基于 .net core / WPF 开发的一款在线客服软件,宗旨是: 开放.开源.共享.努力打造 .net 社区的一款优秀开源产品. 完整私有化包下载地址 https ...
- [docker]封装python的docker镜像
前言 基于alpine的python镜像封装. docker pull python:3.10-alpine 准备 requirements.txt内容: fastapi uvicorn server ...
- Azure Data Factory(六)数据集类型为Dataverse的Link测试
一,引言 之前有讲过 Azure Data Factory 的 Copy Data 的操作,演示了将 Blob Storage1 的数据通过 Azure Data Factory 复制到 Blob S ...
- Gopher进阶神器:拥抱刻意练习,从新手到大师。
发现一个非常友好的工具,帮助我们回顾练习过程,设定目标,并提供丰富多样的Gopher主题练习题. 刻意练习:从新手到大师. Carol 心理学家 Carol Dweck 做过一个实验,她找了一些十岁的 ...
- OpenLDAP服务器搭建
一.关闭防火墙和selinux [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# systemctl d ...
- SpringBoot打成jar运行后无法读取resources里的文件
开发一个word替换功能时,因替换其中的内容功能需要 word 模版,就把 word_replace_tpl.docx 模版文件放到 resources 下 在开发环境中通过下面方法能读取word_r ...
- Record -「CSP-S 2020」赛后总结
其实这次的 CSP 暴露出来了很多问题. 比如策略上的,在 T1 花了太多的时间直接心态爆炸,后面的题只想着把暴力打满.看到 T2 只想着打暴力,根本没有沉下心来想,白白丢了一道(水)题. T3 连暴 ...
- Solution -「洛谷 P4688」「YunoOI 2016」掉进兔子洞
Description (Link)[https://www.luogu.com.cn/problem/P4688]. 每次询问三个区间,把三个区间中同时出现的数一个一个删掉,问最后三个区间剩下的数的 ...