java内存解析
ass BirthDate{
private int day;
private int month;
private int year;
public BirthDate(int d;int m,int y){
day = d;
}
public void setDay( int d){
day = d;
}
public void setMoth(int m){
month = m;
}
public void setYear(int y){
year = y;
}
public int getDay(){
return day;
}
public int getMonth(){
return month;
}
public int getYear(){
return year;
}
public void display(){
System.out.println(day+"-"+month+"-"+year);
}
}
public class Test{
public static void main(String args[]){
Test test = new Test();
int date=9;
BirthDate d1 = new BirthDate(7,7,1970);
BirthDate d1 = new BirthDate(1,1,2000);
test.change1(d1);
test.change2(d2);
System.out.println("adte="+date);
d1.display();
d2.display();
}
public void change1(int i){
i = 1234;
}
public void change2(BirthDate b){
b = new BirthDate(22,2,2004);
}
public void change3(BirthDate b){
b.setDay(22);
}
}
执行Test test = new Test();的时候调用Test的构造方法,int date = 9;在占内存里分配一个变量date等于9, 执行这句话的时候BirthDate d1= new BirthDate(7,7,1970);在占内存里分配一个变量叫d1:xxx指向堆内存里new出来的的一块内存,内存如图:
当执行完BirthDate d1= new BirthDate(7,7,1970);之后,方法完成之后为这个方法分配的局部变量消失所以内存图变成如下图所示:
BirthDate d2= new BirthDate(1,1,2000); 同上述一样;
当执行test.change1(date);这句话时,在调用change1这个方法,这时的i=9;之后,i变成 了1234,当方法执行完毕之后,分配给这个方法的局部变量消失,所以这个方法相当于白调用,栈内存变化如图:
当执行这句话时,test.change2(d1);在堆内存里分配new 出来的一块内存 b这个BirthDay的类型指向new 出来的对象之后,执行完方法之后,为这个方法分配的局部变量消失,没有一个变量指向new出来的新的对象,最后由java的垃圾回收机制回收掉;
当执行test.change3(d2);这段代码时,调用change3这个方法,BirthDay的变量b指向的是d2的setDay这个方法,并且在占内存里有一个变量d ,d的值为22,将22赋值给day,方法完成之后,堆内存里的day由1变成了22,最后方法执行完成之后,d这个变量消失最终的内存图为
java内存解析的更多相关文章
- Java内存解析 程序的执行过程
Java内存解析 栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. ...
- Java进阶(一)Java内存解析
栈.堆.常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同.本文将深入Java核心,简单讲解Java内存分配方面的知识. 首先我们先来讲解一下内存中的各个区域. stack(栈) ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Java当中的内存分配以及值传递问题内存解析
首先必须说明作为Java程序员对于内存只要有大致的了解就可以了,如果你对Java当中的某一个知识点在不需要分析内存分配过程的情况下可以掌握,那就大可不必去研究内存.如果你对知识点已经掌握,那么你应该把 ...
- 【转】java内存分配和String类型的深度解析
一.引题 在java语言的所有数据类型中,String类型是比较特殊的一种类型,同时也是面试的时候经常被问到的一个知识点,本文结合java内存分配深度分析关于String的许多令人迷惑的问题.下面是本 ...
- 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- JAVA内存溢出解析(转)
JAVA内存溢出解析(转) 核心提示:原因有很多种,比如: 1.数据量过于庞大:死循环 :静态变量和静态方法过多:递归:无法确定是否被引用的对象: 2.虚拟机不回收内存(内存泄漏): 说白了就是程序运 ...
- 议题解析与复现--《Java内存攻击技术漫谈》(一)
解析与复现议题 Java内存攻击技术漫谈 https://mp.weixin.qq.com/s/JIjBjULjFnKDjEhzVAtxhw allowAttachSelf绕过 在Java9及以后的版 ...
- Java内存模型深度解析:final--转
原文地址:http://www.codeceo.com/article/java-memory-6.html 与前面介绍的锁和Volatile相比较,对final域的读和写更像是普通的变量访问.对于f ...
随机推荐
- Python--paramiko库:连接远程服务器操作文件
import paramikofrom loggingutils.mylogger import logger as log class SSHConnection(object): def __in ...
- Centos6.5升级openssh至7.4版本
一,备份配置文件,以备升级失败进行回退 二,下载安装包 wget http://www.zlib.net/zlib-1.2.11.tar.gz wget https://openbsd.mirror. ...
- CH5302 金字塔【区间DP】
5302 金字塔 0x50「动态规划」例题 描述 虽然探索金字塔是极其老套的剧情,但是有一队探险家还是到了某金字塔脚下.经过多年的研究,科学家对这座金字塔的内部结构已经有所了解.首先,金字塔由若干房间 ...
- python基础-第四篇-4.1内置函数
lambda表达式 lambda表达式是对简单函数的精简化表达 语法结构:函数名 = lambda:运算表达式 def f1(a): a = a + 1 return a ret = f1(1) pr ...
- 转!mysql备份与还原数据库
备份数据库:1) mysqldump -uroot -p db_name > 20181018_preprod_bak.sql2) 输入数据库密码 还原数据库:1. 系统命令行:mysqladm ...
- 二叉树的先序、中序、后序和中序遍历——Java实现
package treeTraverse; /** * 定义一个树的结点类 */ public class Node { private int data; private Node leftChil ...
- 磁钉导航差速式AGV控制实验
磁钉导航AGV实验 2016-03 本机器是采用RFID电子地标配合磁钉传感器的定位导航AGV.本AGV已初步实现里程计精确解算,磁钉数据融合,AGV定点精准停车.原地旋转换向.远程无线调度的功能,初 ...
- Jenkins+Ant+Jmeter自动化测试平台
持续集成 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动 ...
- Apache配置虚拟主机的三种方法(基于IP、端口、域名)
1 Apache虚拟主机的实现方式有3种. 基于IP的虚拟主机 基于端口的虚拟主机 基于域名的虚拟主机 2.1 启用虚拟主机的准备工作 2.1.1安装httpd [root@mail httpd]# ...
- 数据库之ADO
ADO是一种跨多种语言的数据库访问技术. 在MFC里面微软公司将这些函数封装为以下几个类. 在VS2013版本的MFC中,这些类是如下定义的. CDaoDatabase Class:https://m ...