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 ...
随机推荐
- dot net core 使用 IPC 进程通信
本文告诉大家如何使用dot net core 和其他进程进行通信 一般都是使用 WCF 或 remoting 做远程通信,但是 dot net core 不支持 WCF 所以暂时我就只能使用 管道通信 ...
- DataFrame 操作
# 删除td数据框中的 指定列 td.drop(columns=['ship-city'],axis=1,inplace=True) #删除指定列 并且修改掉原始数据 # 删除td数据框中的 最后一列 ...
- ubuntu下nodejs源码安装
1.从github选择下载自己要安装的nodejs版本,https://github.com/nodejs/node/releases,我下载的版本是node-9.11.2.tar.gz 2.解压no ...
- [HTML] SCSS 备忘录
Sass是成熟.稳定.强大的CSS预处理器,而SCSS是Sass3版本当中引入的新语法特性,完全兼容CSS3的同时继承了Sass强大的动态功能. 特性概览 CSS书写代码规模较大的Web应用时,容易造 ...
- nodejs&mongo&angularjs
http://www.ibm.com/developerworks/cn/web/wa-nodejs-polling-app/
- odoo 开发基础 -- 视图之xpath语法
odoo 视图函数 在整个项目文件中,结构并不是十分明显,虽然它也遵循MVC设计,类比django的MTV模式,各个模块区分的十分明显,在Odoo中,视图的概念不是特别明显,很多时候,我们会将调用模型 ...
- Storm中的定时任务
1.全局定时器 import java.util.Map; import backtype.storm.Config; import backtype.storm.Constants; import ...
- webstorm引用ESLint进行静态代码检查
安装 ESLint 基于 Node 平台,所以 Nodejs 是必须安装的,然后通过 npm 安装 ESLint 包,至于全局安装还是作为开发依赖安装,取决于个人. 然后在 WebStorm 中,打开 ...
- Nginx 配置 Location 规则优先级问题
nginx 的 location与配置中 location 顺序没有关系,与 location 表达式的类型有关.相同类型的表达式,字符串长的会优先匹配. 以下是按优先级排列说明: 等号类型(=)的优 ...
- 关于 OpenIdConnect 认证启用 HTTPS 回调 RedirectUri 不生效问题
在搭建 IdentityServer 服务端后,我们尝试使用了 OIDC(OpenID Connect) 的中间件来代替了原先的 Session 系统认证方式,起初采用的是 HTTP 协议,一切都没有 ...