java内存结构学习的一种打开方式
用Java开发已经四年,中途学了python,Scala,接触这些开发语言后,总感觉Java就像老奶奶裹脚——又臭又长。然,Java虐我千百遍,我待Java如初恋。聊起Java,不得不谈Java的内存结构,请注意,要区别Java内存模型(JMM,关于happens-before、读写屏障啥的)。
结构图
java内存结构包括5大部分,先来一张图围观一下:

其中堆存放的有对象实例、数组;局部变量表存储各种基本数据类型,对象引用(区别对象实例,这个是对象在堆中的地址);方法区存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。
what?这些和我学习Java有毛线关系?来,请思考下面这道题中i、j、k的值:
public static void main(String[] args) {
int i =1;
i =i++;
int j =i++;
int k = i + ++i *i++;
System.out.println("i = "+i);
System.out.println("j = "+j);
System.out.println("k = "+k);
}
我们需要知道,程序的执行就是不断入栈出栈的过程,int i =1,就是在本地变量表中存入i的值1,先来撸张初始状态的图。

i =i++;
这个操作执行了下面的过程:
- 将i 的值1压入操作数栈;
- 修改局部变量表中的i值,为2;
- 赋值语句执行出栈操作,将操作数栈中i的值1返回给局部变量表中的i。
这个操作执行后你会神奇的发现:原来啥子也没有变。
int j =i++;
这个操作执行了下面的过程:
- 在局部变量表中添加变量j;
- 将i的值入栈,为1;
- 修改局部变量表中的i值,为2;
- 赋值语句将操作数栈中的i出栈,赋值给j,为1;
此时内存中的变量状态如下:

int k = i + ++i *i++;
这个操作执行了下面的过程:
- 在局部变量表中添加变量k;
- 将i的值加入操作数栈,为2;
- 将局部变量表中的i值加1,为3(注意++i和i++执行顺序的区别);
- 将局部变量表中的i值加入操作数栈,为3(第二个i);
- 将局部变量表中的i值再次加入操作数栈,为3(第三个i);
- 将局部变量表中的i值加1,为4;
- 赋值语句执行出栈操作 3+3+2,将值11赋值给k;
下面的图是没有执行赋值语句前的内存中变量状态:

相信你已经知道最后的结果了吧:
i = 4
j = 1
k = 11
你是不是要感叹下:原来还能这样…
java内存结构学习的一种打开方式的更多相关文章
- Java 内存结构备忘录
本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...
- Java内存结构详解
Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- Java连接Oracle数据库的三种连接方式
背景: 这两天在学习Oracle数据库,这里就总结下自己上课所学的知识,同时记录下来,方便整理当天所学下的知识,也同时方便日后自己查询. SQL语句的话,这里我就不多讲了,感觉和其他的数据库(MySQ ...
- 文件的三种打开方式及with管理文件上下文
文件的三种打开方式及with管理文件上下文 一.文件的三种打开方式 1.1 只读 f = open(r'D:\pycharm\yjy\上海python学习\456.txt','r',encoding= ...
- Java使用SFTP和FTP两种连接方式实现对服务器的上传下载 【我改】
[]如何区分是需要使用SFTP还是FTP? []我觉得: 1.看是否已知私钥. SFTP 和 FTP 最主要的区别就是 SFTP 有私钥,也就是在创建连接对象时,SFTP 除了用户名和密码外还需要知道 ...
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- JVM运行时内存结构学习
学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) : 1.方法区(Method Area)类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说,所 ...
- Java 内存模型学习笔记
1.Java类 public class Math { public static final Integer CONSTANT = 666; public int math(){ int a = 1 ...
随机推荐
- 第一章 在.net mvc生成EF入门
一. 打开Visual Studio 2017(我使用的是2017) 新建一个mvc项目 命名为StudentEntity 二.1)建立完项目后在项目中右击选择新建项,找到ADO.NET实体数据模型 ...
- MVC 5 Strongly Typed Views(强类型视图)
学习MVC这样久以来,发觉网站上很多MVC的视频或是文章,均是使用Strongly Type views来实现控制器与视图的交互.Insus.NET以前发布的博文中,也大量使用这种方式: <Da ...
- 【转】[MySQL复制异常]Cannot execute statement: impossible to write to binary log since statement is in row for
MySQL复制错误]Last_Errno: 1666 Last_Error: Error executing row event: 'Cannot execute statement: imposs ...
- WCF接口实例介绍
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. WCF整合了原有的windows通讯 ...
- [学习笔记]区间dp
区间 \(dp\) 1.[HAOI2008]玩具取名 \(f[l][r][W/I/N/G]\) 表示区间 \([l,r]\) 中能否压缩成 \(W/I/N/G\) \(Code\ Below:\) # ...
- cad 关键字被保留了?选择集关键字保留了? N S W E关键字无法用?
N S W E是东南西北四个方位,s是南方270度,在设置关键字的时候必须避开这四个关键字. 设置早期的R14 也有.
- sublime text 文件打开时回调一些函数
需求:公司服务端脚本以 .s 结尾的文件,也按 js 语法识别,方便查看函数定义. 每次都 ss:js 比较麻烦,所以写个插件. import sublime, sublime_plugin clas ...
- 安装openvpn
1.安装服务器端openvpn yum install -y openvpn easy-rsa 如果已存在的yum源中找不安装文件,则可通过以下安装epel yum源 rpm -ivh http:/ ...
- Dubbo原理实现之与spring融合
Spring中bean的定义可以通过编程,可以定义在properties文件,也可以定义在通过xml文件中,用的最多的是通过xml形式,由于xml格式具有很好的自说明便于编写及维护.对于xml的文档结 ...
- Linux巩固记录(7) Hbase安装
zookeeper安装好,并启动成功后,接下来开始安装hbase #下载hbase wget http://mirror.bit.edu.cn/apache/hbase/1.3.1/hbase-1.3 ...