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

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

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

在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. Centos7下创建Oracle用户

    Centos7下创建Oracle用户 Oracle中,一个用户其实就类似于一个数据库,本次就来创建一个新用户 登录 将系统用户切换到oracle用户下 su - oracle -- 启动sqlplus ...

  2. Nginx配置Https缺少SSL模块(已解决)

    1.Linux下Nginx配置https nginx下载和安装此处就忽略,可自行百度 1.1.配置https 打开nginx配置文件 vim /usr/local/nginx/conf/nginx.c ...

  3. 二分查找非递归Algorithm(java)

    二分查找的适用条件 二分查找只适用于有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 二分查找的运行时间为对数时间O(LONG2 N) 二分查找非递归的实现 /** * @param ...

  4. Anaconda 使用时,conda activate 失败

    今天使用一台电脑上新安装的 anaconda 时,运行 conda activate, 出现如下报错: 错误提示中,说要把 . C:\ProgramData\Anaconda3\etc\profile ...

  5. Linux 命令:lsof

    参考文档:lsof命令详解 lsof,列出系统中所有打开的文件. 各列字段意义如下: COMMAND: 进程的名称 PID: 进程标识符 USER: 进程所有者 FD: 文件描述符,应用程序通过文件描 ...

  6. Power AutoMate: 运行脚本程序

    运行脚本文件 操作步骤 配置脚本 点击脚本文件菜单,选中运行python脚本.在其中输入需要徐行的脚本点击保存 之后界面会如下所示: 运行程式 可以看到程式正常运行

  7. 《CUDA编程:基础与实践》读书笔记(1):CUDA编程基础

    1. GPU简介 GPU与CPU的主要区别在于: CPU拥有少数几个快速的计算核心,而GPU拥有成百上千个不那么快速的计算核心. CPU中有更多的晶体管用于数据缓存和流程控制,而GPU中有更多的晶体管 ...

  8. 微信的 h5 支付和 jsapi 支付

    目录 申请商户号 申请商户证书 设置APIv3密钥 下载 SDK 开发包 下载平台证书 关联 AppID 账号 开通 H5 支付 H5支付流程 开通 JSAPI 支付 JSAPI 支付流程 通用微信支 ...

  9. JavaScript的Map和WeakMap

    熟悉JavaScript的Map和WeakMap Map Map的键/值可以是任何类型 基本API 初始化映射: //使用new关键字和Map构造函数进行初始化 const m1 = new Map( ...

  10. 用Python语言进行多元时间序列ARIMAX模型分析

    1.ARIMAX模型定义 ARIMAX模型是指带回归项的ARIMA模型,又称扩展的ARIMA模型.回归项的引入有利于提高模型的预测效果.引入的回归项一般是与预测对象(即被解释变量)相关程度较高的变量. ...