我们知道java中new方式创建的对象都是在堆中创建的,而局部变量对应的值存放在栈上。那么java中的int [] arr={1,2,3}是存放在什么地方的呢,int []arr = new int[3]又是存放在什么地方的呢,

下面我们通过编写两个小例子,通过查看生成的字节码文件,来了解jvm会如何来处理这两种情况的。

1.int[] arr = new int[3]示例

public class ArrayTest {
public static void main(String[] args) {
int[] arr = new int[3];
} }

生成的字节码文件如下:这里只显示主要信息。java对应的字节码指令信息请参考博文java 字节码指令

Compiled from "ArrayTest.java"
public class ArrayTest {
public ArrayTest();
Code:
0: aload_0 //从局部变量0中加载引用到堆栈,即将当前对象引用压入栈。
1: invokespecial #8 //调用对象的实例方法,就是初始化方法init, 这里#8表示的是对应在方法池里方法的引用,
4: return public static void main(java.lang.String[]);
Code:
0: iconst_3 //将3压入栈。
1: newarray int //该指令首先从栈中弹出数据3,并创建一个大小为3的整形数组,并将该数组的对象引用(地址)压入栈中。
3: astore_1 //将弹出栈中对象引用存放到局部变量1中。
4: return
}

2.int arr[] = {1,2,3}示例:

public class ArrayTest {
public static void main(String[] args) {
//int[] arr = new int[3];
int[] arr = {1,2,3};
} }

生成的字节码如下:

Compiled from "ArrayTest.java"
public class ArrayTest {
public ArrayTest();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object."<init>":()V
4: return public static void main(java.lang.String[]);
Code:
0: iconst_3
1: newarray int //同上
3: dup //拷贝一份栈顶的值,并将其压栈,
4: iconst_0
5: iconst_1
6: iastore //将栈顶的1存放到数组的0索引的位置
7: dup
8: iconst_1
9: iconst_2
10: iastore //将栈顶2存放到数组的1索引的位置
11: dup
12: iconst_2
13: iconst_3
14: iastore //将栈顶3存放到数组2索引的位置。
15: astore_1
16: return
}

通过生成的字节码我们可以看出两种数组的创建都是都过newarr关键字来创建的,jvm会在堆中为其开辟空间,并将数组的引用存放在栈中。

由此可知java中的数组是在堆中分配空间。但是在C,C++中数组是可以在栈中分配空间的。

透过字节码分析java基本类型数组的内存分配方式。的更多相关文章

  1. 透过字节码分析Java动态代理机制。

    一.创建动态代理代码 1.创建接口 public interface Subject { void request(); } 2.创建接口实现类 public class RealSubject im ...

  2. 通过字节码分析java中的switch语句

    在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下): public class Ag{ static pub ...

  3. 通过字节码分析Java方法的静态分派与动态分派机制

    在上一次[https://www.cnblogs.com/webor2006/p/9723289.html]中已经对Java方法的静态分派在字节码中的表现了,也就是方法重载其实是一种静态分派的体现,这 ...

  4. 通过字节码分析Java异常处理机制

    在上一次[https://www.cnblogs.com/webor2006/p/9691523.html]初步对异常表相关的概念进行了了解,先来回顾一下: 其源代码也贴一下: 下面来看一下jclas ...

  5. Java字节码分析

    目录 Java字节码分析 查看字节码详细内容 javap 实例分析 Java字节码分析 对于源码的效率,但从源码来看有时无法分析出准确的结果,因为不同的编译器版本可能会将相同的源码编译成不同的字节码, ...

  6. Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)

    前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...

  7. JVM-String比较-字节码分析

    一道String字符串比较问题引发的字节码分析 public class a { public static void main(String[] args)throws Exception{ } p ...

  8. 通过字节码分析this关键字以及异常表的重要作用

    在之前的字节码分析中缺少对异常的介绍,这次主要来对字节码异常表相关的东东进行一个学习,下面先来编写一个相关异常的小程序: 接着编译来看用javap -verbose来查看一下它的字节码信息: xion ...

  9. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

随机推荐

  1. ADO.net Connection对象简介

    Connection对象 学习的是刘皓的文章  ADO.NET入门教程(四) 品味Connection对象 这篇文章开始水平一般起来了,主要介绍了要优雅的使用这个对象 1 用try...catch.. ...

  2. BigTable读后笔记

    BigTable读后笔记 GFS可能出现重复记录或者padding,Bigtable如何处理这种情况使得对外提供强一致性模型? ANS: Bigtable写入GFS的数据分为两种: 1)操作日志,当T ...

  3. spring boot mybatis XML文件读取properties配置信息

    配置文件application.properties中相关配置信息可以在部署以后修改,引用配置信息可以在代码和mybatis的映射文件中 1.JAVA代码 可以通过变量去读取 application. ...

  4. 持续集成及部署利器:Go(不要和Google的编程语言Go混淆了!)

    Go是一款先进的持续集成和发布管理系统,由ThoughtWorks开发.(不要和Google的编程语言Go混淆了!)其前身为CruiseControl,是ThoughtWorks在做咨询和交付交付项目 ...

  5. 微软Insider Dev Tour 活动

    总述 Insider Dev Tour 将在6月全球29个城市中展开.这次活动是通过与微软全球MVPs和RD合作进行的,并涵盖了微软最新的开者方面的最新消息. 日期提示 2018年5月7日 : 暂无其 ...

  6. DB First EF中的存储过程、函数、视图

    视图约等于表(属性)存储过程变为方法,方法中调用存储过程 EF可以调用存储过程,DB First的流程是刷新模型,获取存储过程,调用参考:http://blog.csdn.net/sudazf/art ...

  7. 使用MultiByteToWideChar转换UTF8为GBK(UTF8在Windows的代码页是CP_UTF8)

    两个使用的函数: 1,UTF8转化为Unicode,inline为了编译后更快运行,老用到了,返回字符串为了使用链式表达式 inline WCHAR  *UTF8ToUnicode(const cha ...

  8. C# 生成txt日志文件

    /// <summary> /// 创建日志文件,每天一个 /// </summary> /// <param name="logContent"&g ...

  9. LINQ查询表达式---------where子句

    LINQ查询表达式---------where子句 where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素. 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用), ...

  10. 内存可用性判断 IsBadCodePtr IsBadReadPtr 等等

    程序异常崩溃,多数是有内存访问异常引起.为定位崩溃位置通常考虑加强内存访问控制,如此有必要进行内存可用性判断,从<Windows核心编程>中看到内存指针的可用性判断方法,感觉还不错,此处记 ...