方法区和堆区是数据共享区。

栈区:数据不共享。方法参数、局部变量、参与运算的中间结果、返回值等等都在栈区中。

堆区:数据共享。存放对象。

方法区存放类型信息,类型信息包括:字段信息、方法信息、该类型的常量池、类变量、一个到类ClassLoader的引用,一个到Class类的引用。这部分数据是共享的,是一个Java虚拟机实例或者说一个Java程序共享的。

当一个类被多个不同的ClassLoader加载的时候,需要对ClassLoader标识。同时也要标识一个Class类,他的完全限定名。

public class Test {

    int a;
int b;
public static void main(String[] args) {
int c = 20;
Test test = new Test();
test.change(test,c);
System.out.println(test.a+" first "+c);
} public void change(Test t,int c){
c=50;
t.a=10;
t = new Test();
t.a=20;
System.out.println(t.a+" second");
}
}

结果是:

20 second
10 first 20

main方法和change方法会在java栈中开辟两个栈帧,一个方法对应一个栈帧,当前栈帧代表调用当前的方法,每个栈帧会有他的数据结构,他的数据结构就是在前面提到的栈区存放的东西。

main方法接受一个args参数和定义两个局部变量。

int c = 20;那么会在这个栈帧定义一个值为20,名为c的变量。暂时可以这么理解,更细的话就要看他执行的时机了。

Test test  = new Test();

这样一new做的事情可以多了。先看右边,他在堆区开辟一个存储空间,这个存储空间有地址值,并且这块空间持有一个类型信息在方法区的引用。那么方法区的那块空间就描述着该类的类型信息了,包括字段、方法、类变量等等,上面有。

左边是一个Test类型的引用,他持有的是堆区那块地址值。

当main方法调用change时,是把上面传过去呢?其实是把值传过去了,把对象的地址值和20传过去了。

change方法接受这两个参数,他就会为这两个参数在栈区中开辟两块存储空间,用来存储这两个参数,在这里没有定义方法的局部变量。

这时t=传进来的地址值,c=20;

现在变化来了,改变他们的值。c=50;他这里改变改变的是谁的值呢。其实是改变了属于change方法这个栈帧的变量值。而没有改变到main方法栈帧的变量值。所以在打印的时候c还是20,不要因为变量名而迷惑了。

下一步:t.a=10;这时候这个a是属于传进来对象的,也就是第一个对象。他的a被改变了,等于10。

再下一步:t = new Test();这时候堆区就有两个对象了,这个t的值不再是以前对象的地址值了,而是新的对象的地址值了,那这个新的对象也有自己的成员字段和方法,等等。

最后t.a=20;改变的是新对象的a变量,而不是以前的。

所以结果就这样了。

Java中方法参数的传递都是传值,引用数据类型传的是地址值,字符串传的是"内容",基本数据类型就是普通的值。

java虚拟机存储区的更多相关文章

  1. 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 一.Java内存布局浅谈 1. 总述 我们知道,线 ...

  2. java虚拟机构造原理

    Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序.程序开始执行时他才运行,程序结束时他就停止.你在同一台机器上运行三个程序,就会有三个运行中的Java虚拟机. ...

  3. java虚拟机规范(se8)——java虚拟机结构(二)

    2.5 运行时数据区域 java虚拟机定义了多个用于程序执行期间的运行时数据区域.这些数据区域中一些随着java虚拟机的启动而创建,随着虚拟机的退出而销毁.其他的数据区域时和线程相关的.线程相关数据区 ...

  4. Java虚拟机内存配置

    在做java开发时尤其是大型软件开发时经常会遇到内存溢出的问题,比如说OutOfMemoryError等.这是个让开发人员很痛苦.也很纠结的问题,因为我们有时不知道什么样的操作导致了这种问题的发生.所 ...

  5. Java虚拟机及运行时数据区

    1.Java虚拟机的定义 Java虚拟机(Java Virtual Machine),简称JVM.当我们说起Java虚拟机时,可能指的是如下三种不同的东西: 抽象的虚拟机规范 规范的具体实现 一个运行 ...

  6. 【转】 Java虚拟机内存的堆区(heap),栈区(stack)和静态区(static/method)

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区:1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令 ...

  7. 笔记:Java虚拟机运行时数据区

    Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域: 1.程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器:由于Java虚拟机的 ...

  8. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  9. Java虚拟机一 运行时数据区(栈、堆、方法区等)

    Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的 ...

随机推荐

  1. jquery 获取当前对象的id取巧验证的一种方法

    <!doctype html><html><head><meta charset="utf-8"><title>titl ...

  2. 【转】python删除文件里包含关键词的行

    import shutil with open('/path/to/file', 'r') as f: with open('/path/to/file.new', 'w') as g: for li ...

  3. WinForm笔记一:文本框只允许输入数字

    在WinForm的文本框中,有时候只允许数字,而不能输入除数字以外的其他字符,要调用TextBox的KeyPress事件,代码如下: //只允许输入数字 if (e.KeyChar<'0'||e ...

  4. java 缓存ehcache的使用(使用方式一)

    实体要序列化 resource文件夹下建立 ehcache.xml <?xml version="1.0" encoding="UTF-8"?> & ...

  5. [SOJ] 导游

    Description Mr. G. 在孟加拉国的一家旅游公司工作.他当前的任务是带一些游客去一些遥远的城市.和所有国家一样,一些城市之间有双向道路.每对相邻城市之间都有一条公交路线,每条路线都规定了 ...

  6. 为OLED屏增加GUI支持

    为OLED屏增加GUI支持1:OLED驱动 为OLED屏增加GUI支持2:2D图形库 为OLED屏增加GUI支持3:字库 为OLED屏增加GUI支持4:文本框控件 为OLED屏增加GUI支持5:图片控 ...

  7. qt5.6 for android

    尝试在qt下写android的程序.测试,没有编译成功. 在选项-android配置页面,提示有"Qt version for 3 architectures are missing&quo ...

  8. python 小程序(1)

    这是在一个文件夹下将符合条件的文件中,第一列是相同的,对每个文件中第二列的数求和,输出为一个txt文件,文件内容格式为:第一列的每个数对应[这个所有符合条件的文件中第一列这个数对应的第二个数的]求和 ...

  9. mpich2 下运行时出现“由于目标计算机积极拒绝,无法连接”的错误

    进行mpi并行编程时候,win8下使用mpich2时候,安装目录下找到wmpiexec.exe程序打开,填入编写好的.exe程序地址并制定执行的任务数目的想要运行时候,出现错误: unable to  ...

  10. 深入了解——CSS3新增属性

    CSS3 选择器(Selector) 写过 CSS 的人应该对 CSS 选择器不陌生,我们所定义的 CSS 属性之所以能应用到相应的节点上,就是因为 CSS 选择器模式.参考下述代码: 清单 1. C ...