在J2SE中,通过进行内存分析,可以让我们更好的理解我们的程序在内存中是怎么被分配内存的。也能让我们更好的理解我们的代码是怎么运行的。

对于我自己来说分析内存也是一件很有趣的事情。所以下面通过一个例子来总结一下程序运行过程的中内存分配.

### 程序实例

~~~

public class Point {

double x,y,z;

Point(double _x,double _y,double _z)

{

x=_x;

y=_y;

z=_z;

}

void setX(double _x)

{

x=_x;

}

double getDistance(Point p)

{return (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)+(z-p.z)*(z-p.z);}

}

~~~

~~~

public class TestPoint {

public static void main(String[] args) {

Point p=new Point(1.0,2.0,3.0);//第一步

Point p1=new Point(0.0,0.0,0.0);//第二步

System.out.println(p.getDistance(p1));//第三步

p.setX(5.0);//第四步

System.out.println(p.getDistance(new Point(1.0,1.0,1.0)));//第五步

}

}

~~~

### 内存分析

**第一步**

首先定义了一个变量,所以在栈内存中会分配一块空间来存储变量,变量名为P,它指向了一个new出来的对象,这个new出来的对象,当然是放到堆内存。

在执行的过程中调用了Point的构造方法.在执行构造方法的过程中,在栈内存中临时分配了三个空间分别存储_x,_y,_z,然后再把这三个值赋值给点对象中的x,y,z.

![](https://box.kancloud.cn/2016-03-23_56f1fee63350c.jpg)

赋值完成后这些临时分配的变量将会被取消.所以第一步执行完后的内存分配如下图

![](https://box.kancloud.cn/2016-03-23_56f1fee647396.jpg)

**第二步**

第二步的执行过程和第一步类似,不再做赘述,该步执行完后的内存分配如下图.

![](https://box.kancloud.cn/2016-03-23_56f1fee65be6a.jpg)

**第三步**

该步调用了一个方法,从方法中我们可以看到有一个形参.所以首先在栈内存中临时分配一块空间,保存这个形参,也就是局部变量P.再看getDistance()方法中我们实际传入的是P1,所以将p引用P1引用的对象(这里注意区分此刻分配的局部变量P和第一步new出来的P不是一回事)

该步的方法是有返回值的,所以需要在栈中分配空间来保存这个返回值.内存分配图如下

![](https://box.kancloud.cn/2016-03-23_56f1fee66fad7.jpg)

将返回值打印后,临时分配的内存空间取消.其内存分配图和第二步执行完后的内存分配图是相同的.

**第四步**

从调用的方法上看,首先要在栈中分配一个临时变量_x,值为5.0.然后再将值赋值给P指向的对象.执行完后临时变量被取消.内存分配图如下.

![](https://box.kancloud.cn/2016-03-23_56f1fee681766.jpg)

**第五步**

此表达式比较复杂,当一个表达式复杂的时候,我们要从里向外分析.

基于此原则,分析得到,首先要在堆内存中new一个对象,这时这个对象并没有被引用

然后执行方法.上面我们已经分析过了,执行这个方法我们需要先在栈中临时分配一个变量P,此时需要将new出的对象给临时变量P,也就是说这个P引用我们刚刚new出的那个对象。

然后计算两点的距离,这时需要一个临时变量来保存返回来的数据.

方法执行完后,所有临时分配的内存被取消.这时要注意的是我们new出来的对象是通过垃圾回收机制取消的。

内存分析如下图

![](https://box.kancloud.cn/2016-03-23_56f1fee696d3f.jpg)

### 程序执行完后的内存分配

最后展示一张程序执行完后的内存分配图

![](https://box.kancloud.cn/2016-03-23_56f1fee6b550c.jpg)

### 总结

对于内存分析之前认为挺难的,但是经过仔细分析后发现其实内存分析很简单,只要大家能够看明白以下这几点,我想对于一些简单的内存分析你一定没有问题了.

(1)形参要临时分配空间,程序执行完后要 取消空间分配.

(2)对于复杂的程序要从里到外分析.一步步来.

(3)有返回值的方法,其返回值也是要分配给一个临时变量的.同样的使用完后要取消.

(4)临时new出来的对象是利用垃圾回收机制取消的.

(5)静态成员变量时放在哪里的,是怎么分配内存的.(这个例子并没有展示静态成员变量的分配)

java怎么看内存值_【java】内存分析相关推荐

  1. java 多线程 内存泄露_关于内存泄露的总结

    大致先分为五个小模块: 1.什么是内存泄漏 2.有哪些情况会导致内存泄漏切如何解决 3.如何检测内存泄漏 4.Java得基本数据类型和占用字节 5.什么是内存溢出和解决办法 一.什么是内存泄漏(Mem ...

  2. java arraylist 方法返回值_返回arraylist方法

    ArrayList 什么是ArrayList 可以简单的认为是一个动态数组:实际上ArrayList就是用数组实现的,长度不够时,调用Arrays.copyOf方法,拷贝当前数组到一个新的长度更大的数 ...

  3. java 像素值_(java)图片像素的操作

    因为做个游戏,需要一些图片资源,而获取到的图片资源都是jpg格式的,不是透明的,例如下面样式的: 为了取出其中的蓝光部分,透明化黑色背景,我开始了图片处理探索之路. 这篇文章的内容包含以下部分: 1. ...

  4. java如何获得键值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  5. java数组包含某个值_如何检查Java数组是否包含值?

    java数组包含某个值 如何检查Java数组是否包含值? (How to Check if Java Array Contains a Value?) There are many ways to c ...

  6. java对数字的处理_[java初探10]__关于数字处理类

    前言 在我们的日常开发过程中,我们会经常性的使用到数字类型的数据,同时,也会有众多的对数字处理的需求,针对这个方面的问题,在JAVA语言中.提供解决方法的类就是数字处理类 java中的数字处理类包括: ...

  7. 2678v3支持内存频率_电脑内存别乱加,不了解这些白花钱

    随着这两年游戏的发展,及应用软件不断的升级,电脑对内存条需求是越来越大了,经常玩电脑的人都知道了内存条重要性. 在这里给大家说下你现在用的电脑是否需要新添或者增加内存,以及选择一条适合你电脑的内存 首 ...

  8. r720支持多少频率的内存吗_关于内存频率,高频和低频的性能差距大吗?明白这3点很重要...

    很多朋友在购买新机或者升级硬件的时候,都会特别注意硬件的性能,比如内存方面,除了要考虑内存的品牌和容量之外,还会考虑是否选择高频率内存.不过高频率内存的价格,也足够让人小心地"掂量" ...

  9. java函数void返回值是,Java中main()函数的返回值是什么( )。A、StringB、intC、c......

    下面的哪个是Java的关键字()A.stringB.abstractC.NULLD.Boolean Javaapplication中的主类需包含main方法,以下哪项是main方法的正确形参?A.St ...

最新文章

  1. php set medias,laravel5.1 -- Integrate FileManager and CKeditor into laravel
  2. 简单完整地讲解tensorflow模型的保存和恢复
  3. 国产AI框架再进化!百度Paddle Lite发布:率先支持华为NPU在线编译,全新架构更多硬件支持...
  4. 【SSM框架系列】Spring-MVC的组件解析
  5. 三四线城市高价房内幕:开发商坐庄,中介布局,购房者盲目下注
  6. 图的遍历DFS与BFS(邻接表)
  7. SAP Spartacus User form属性的运行时字段明细
  8. (priority_queue)自定义优先级
  9. E - 最长上升子序列
  10. shell-最近7天目录
  11. python怎么调用函数的返回值_python函数的返回值是什么
  12. 龙芯pmon启动流程概述
  13. 集团企业智慧建造管理平台劳务管理系统
  14. 组织行为学笔记(3)——情绪和心情
  15. 基于MATLAB的图像分割系统
  16. linux音频驱动之ALSA框架
  17. 电脑开机将在一分钟后自动重启问题
  18. 小梅哥Xilinx FPGA学习笔记1——二选一多路器
  19. android 自定义canvas,android随笔之自定义View的Canvas用法
  20. 带你了解网络解说--链路聚合技术

热门文章

  1. 论文的事情终于可以告一段落了
  2. python储存数据分行_基于python实现对文件进行切分行
  3. 6-3 二叉搜索树中的最近公共祖先 (25 分)
  4. 5G对于数据中心的影响有哪些
  5. C语言基础专题 - 通过案例历学 - 结构体
  6. AcWing 1762. 牛的洗牌(暴力)
  7. SWPU ROUND #6(DIV.3)
  8. jquery粘贴按钮_实现前端点击按钮自动复制剪贴板功能
  9. 安卓android中国象棋chess程序项目源码源代码,C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!,c语言笔记大全...
  10. 定区关联快递员 定区关联收派时间