前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中数组的内存分析

Java中数组的内存分析

作者头像
框架师
发布2019-12-03 12:30:32
7050
发布2019-12-03 12:30:32
举报
文章被收录于专栏:墨白的Java基地墨白的Java基地

正文

引言:

墨白在文末给大家准备了程序员的适用壁纸,需要的小伙伴自取,今天的内容是给大家聊聊Java中数组的内存分析和原理,很多朋友可能已经忘记了,毕竟这是非常基础的点了,这次算是给大家复习了吧!

  • 内存简介

内存是计算机中的一个重要原件,是一种临时存储区域,作用是运行程序。我们程序员编写的程序是存放在硬盘中的,但是在硬盘中的程序它是不会运行的,必须放进内存中才能运行,每个程序运行完毕后会自动清空内存。

  • 先看下Java中的数组内存图

从上图我们可以看到,在一个硬件中(电脑),包含了系统,系统中包含了内存,我们所有的程序都是运行在系统的内存中,如微信,QQ,JVM虚拟机.

  • Java虚拟机的内存划分

为了提高运算效率,Java虚拟机就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

  • JVM的内存划分:

区域名称

功能

寄存器

CPU在运算,用于保存线程下一个要执行的命令

本地方法栈

JVM在使用操作系统的时候使用

方法区

存储编译后的class文件

堆内存

存储对象或者数组,只要是new出来的,全部都存储在堆内存

方法栈

方法运行时的内存,比如main方法运行,进入方法栈中执行

我们作为Java攻城狮,需要重点关注的只有三个地方,方法栈,方法区,和堆内存,这三个内容需要我们重点关注!!!

一个数组在内存中的内存图分析以上方法执行,输出的结果是[I@38cccef,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。

输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素

代码语言:javascript
复制
public class Demo01 {
    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr); // [I@50cbc42f
        arr[1] = 2;
        System.out.println(arr[1]);
    }
}
  • 两个数组内存图
代码语言:javascript
复制
package com.mobaijun;

public class Demo2 {
    public static void main(String[] args) {
        int[] arr1 = new int[2];
        int[] arr2 = new int[3];
        System.out.println(arr1);
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);

        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);

        // 给arr1数组的索引为0元素赋值100
        arr1[0] = 100;
        // 给arr2数组的索引为0元素赋值200
        arr2[0] = 200;

        System.out.println("-----------");
        System.out.println(arr1);
        System.out.println(arr1[0]);
        System.out.println(arr1[1]);

        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
    }
}
  • 两个变量指向一个数组

两个变量都指向了同一个数组,无论通过哪个变量操作数组,对方都会受到影响。

代码语言:javascript
复制
package com.mobaijun;

public class Demo3 {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[0] = 100;
        arr[1] = 200;
        arr[2] = 300;

        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        // 定义数组变量arr2,将arr的地址赋值给arr2
        // arr和arr2指向堆中同一个数组
        int[] arr2 = arr;
        arr2[0] = 111;
        arr2[1] = 222;
        arr2[2] = 333;

        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

        System.out.println(arr2);
        System.out.println(arr2[0]);
        System.out.println(arr2[1]);
        System.out.println(arr2[2]);
    }
}

结语:Java虚拟机内存图对于理解Java程序非常的关键,大家应该熟悉数组代码的内存机制,对于学习Java技术帮助很大。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 框架师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档