相信大家有时候在读代码的时候应该都会有以下情况:

  • 这个对象本定义在上面,乱跑什么?怎么又到下面去了?
  • 欸?我明明改变了这个对象的值,怎么没变呢?

要想搞清楚某一对象在程序中是怎样活蹦乱跳的,首先我们要对其内存的状况要有些了解。

在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之对象内存分析的更多相关文章

  1. Java常见对象内存分析

    首先要明确Java内存的个位置上放的是啥 类.对象.实例三者的关系: 1.类:是对象的模板,可以实例化对象.(this不能出现在静态方法中) 2.对象:类的个体. 3.实例:实现的对象. 4.对应的引 ...

  2. Java面向对象_对象内存分析—值传递和引用传递

    对象内存分析,我一直学的比较模糊,今天抽空整理一下,希望能理清. 先说一下,内存分析从何而来,这对于我们这些刚接触java的人来说都比较模糊,就从new关键字说起吧. new关键字表示创建一个对象或者 ...

  3. 【Java线程与内存分析工具】VisualVM与MAT简明教程

    目录 前言 VisualVM 安装与配置 本地使用 远程监控 MAT 使用场景 安装与配置 获得堆转储文件 分析堆转储文件 窥探对象内存值 堆转储文件对比分析 总结 前言 本文将简要介绍Java线程与 ...

  4. Java单个对象内存布局.md

    我们在如何获取一个Java对象所占内存大小的文章中写了一个获取Java对象所占内存大小的工具类(ObjectSizeFetcher),那么接下来,我们使用这个工具类来看一下Java中各种类型的对象所占 ...

  5. java执行程序的内存分析系列专栏

    近段时间研究了java的程序执行过程中的内存分配,收获颇多,解决了我最近时间学习java的很多困惑点.写java内存分析系列的目的主要有两个,一来是希望给像我一样的java初学者一定的启发,希望也能解 ...

  6. java执行程序的内存分析系列专栏二之static变量和方法内存分析

    昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能 ...

  7. String对象内存分析

    Java中内存分析: 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中). 堆(heap): ...

  8. Java内置内存分析

    Java内存分析 package com.chao.reflection; public class Test05 { public static void main(String[] args) { ...

  9. JProfiler进行Java运行时内存分析

    原文地址:https://www.cnblogs.com/onmyway20xx/p/3963735.html 在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析 ...

  10. JAVA 对象内存分析

    1.jmap -heap pid 或者 jmap -histo pid 2.jmap -dump:file=folder/dumpFileName.txt,format=b pid 3.对3的输出文件 ...

随机推荐

  1. SpringBoot整合WebService(实用版)

    SpringBoot整合WebService 简介 WebService就是一种跨编程语言和跨操作系统平台的远程调用技术 此处就不赘述WebService相关概念和原理了,可以参考:https://b ...

  2. 如何将 dubbo filter 拦截器原理运用到日志拦截器中?

    业务背景 我们希望可以在使用日志拦截器时,定义属于自己的拦截器方法. 实现的方式有很多种,我们分别来看一下. 拓展阅读 java 注解结合 spring aop 实现自动输出日志 java 注解结合 ...

  3. [nginx]日志中记录自定义请求头

    前言 假设在请求中自定义了一个请求头,key为"version",参数值为"1.2.3",需要在日志中捕获这个请求头. nginx日志配置 只需要用变量http ...

  4. [jmeter]快速入门

    前言 以压测一个api为例.假设有一个非常简单的api http://192.168.1.111:8080/,只是返回 helloworld 字符串. 准备 打开 jmeter,新建测试计划 在测试计 ...

  5. Android OAID 获取 基于MSA oaid_sdk_1.0.25.zip

    目录 简介 SDK下载 支持版本 开始使用 可能遇到的问题 替代方案 APK下载 写在最后 简介 本文链接:https://www.cnblogs.com/dks-/p/14357041.html 根 ...

  6. 《Kali渗透基础》02. 基本工具

    @ 目录 1:基本工具 1.1:NetCat 1.1.1:命令参数 1.1.2:示例 1.2:NCat 1.2.1:命令参数 1.2.2:示例 1.3:WireShark 1.4:TCPdump 1. ...

  7. 搭建LNMP 架构

    搭建LNMP 架构 环境准备 lnmp 需要 安装 nginx mysql php 软件 #关闭防火墙 systemctl disable --now firewalld #临时禁用SELinux的强 ...

  8. 【matplotlib基础】--刻度

    Matplotlib中刻度是用于在绘图中表示数据大小的工具. 刻度是坐标轴上的数字或标签,用于指示数据的大小或值,通常以整数或小数表示,具体取决于坐标轴的类型和限制. 1. 主次刻度 默认的绘制时,坐 ...

  9. UM 百度富文本编辑器上传报错

    看下报错信息 这三张图记录了当时,上传图片 遇见的报错信息 最终解决方案 我把UM下jsp文件下的ueditor-mini.jar包拷贝到WEB_INF下的lib文件夹下,就成功了. maven的话把 ...

  10. Springboot中使用线程池的三种方式

    前言 多线程是每个程序员的噩梦,用得好可以提升效率很爽,用得不好就是埋汰的火葬场. 这里不深入介绍,主要是讲解一些标准用法,熟读唐诗三百首,不会作诗也会吟. 这里就介绍一下springboot中的多线 ...