正文

引言:

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

内存简介

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

先看下Java中的数组内存图

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

Java虚拟机的内存划分

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

JVM的内存划分:

区域名称

功能

寄存器

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

本地方法栈

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

方法区

存储编译后的class文件

堆内存

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

方法栈

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

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

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

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

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]);

}

}

两个数组内存图

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]);

}

}

两个变量指向一个数组

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

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技术帮助很大。

你点的每个“在看”,我都认真当成了喜欢

java数组释放内存空间,Java中数组的内存分析相关推荐

  1. C#中的数组和C++中数组的区别

    c#中的数组和c++中数组的区别 c#中数组是引用类型,c#定义整型数组方式是:int [] intarray = {1,2,3};或int [] intarray = new int[10];而c+ ...

  2. 动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】

    为了动态的管理宝贵的内存,许多程序中要使用到动态内存分配.一般情况下,在c语言中,使用malloc()函数来分配指定大小的内存空间,用free()函数来释放这块内存空间.但是,往往初学者在编写这类程序 ...

  3. java 数组 去掉第一个_java中数组的理解以及如何去掉断点

    数组也是对象 数组是放置相同类型的数据 数组里面放置的每一个变量都是有下标的. 数组的长度是确定的 数组的元素类型必须是相同的 数组类型可以是任何数据类型,包括基本类型和引用类型 数组变量属于引用类型 ...

  4. java list 内存释放_java集合ArrayList中clear方法内存释放分析

    最近在看ArrayList源码的时候看到了ArrayList的clear方法,源码如下: public void clear() { modCount++; // clear to let GC do ...

  5. java内部类内存泄漏,Android中常见的内存泄漏和解决方案

    什么是内存泄漏? 简单点说,就是指一个对象不再使用,本应该被回收,但由于某些原因导致对象无法回收,仍然占用着内存,这就是内存泄漏. 为什么会产生内存泄漏,内存泄漏会导致什么问题? 相比C++需要手动去 ...

  6. java 分享到qq空间_Android中集成QQ登陆和QQ好友分享及QQ空间分享

    extends : http://blog.csdn.net/arjinmc/article/details/38439957 相关官方文档及下载地址: 如果只用分享和登陆,用lite包就可以,体积小 ...

  7. 05 | 数组:为什么很多编程语言中数组都从0开始编号?

    什么是数组? 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. 线性表存储结构 连续内存空间 存储相同类型数据 优点:连续内存+相同类型数据=数组可以实现 ...

  8. oracle自动释放表空间,Oracle中关于清除数据和释放表空间

    一.表的重命名 flashback table test2 to before drop rename to test3;--[to test3]将表重命名 drop table test3 purg ...

  9. c语言memset清空指向数组的指针_C语言中数组和指针的关系

    数组的数组名其实可以看作一个指针.看下例: 1.    int array[10]={0,1,2,3,4,5,6,7,8,9},value; 2.    value=array[0]; //也可写成: ...

最新文章

  1. linux 虚拟环境
  2. Load 方法 暨 程序的加载顺序
  3. 恢复从回收站中被删除的文件的方法
  4. 安装Sublime Text 支持Go插件
  5. python装饰器模块加载后的若干解释
  6. easyUI创建人员树
  7. python鼠标碰撞_获取鼠标指针测试item之间的碰撞
  8. sqlserver2008r2安装
  9. 微信小程序云开发教程-云函数获取用户授权信息
  10. c++ primer 6.3.3节练习答案
  11. php 易宝支付,网站接入易宝支付遇上的问题
  12. 算法分析与设计实验报告四——回溯法实验
  13. 2016届腾讯实习生招聘上海站回忆版
  14. 判断图书的ISBN号码是否正确
  15. 利用微信搜索抓取公众号文章
  16. Linux 中 TCL 和 Expect语法
  17. 出国留学考试指导大全:托福85分是个坎儿
  18. 有关计算机英语作文素材,英语写作素材
  19. ExoPlayer-三AudioRender
  20. 使用 Electron 给前端项目 打包成exe

热门文章

  1. 做一个好看的微信小程序抽奖页面
  2. 我的书架——一些关于书的拉杂胡说(转贴)
  3. shell 编程arry数组
  4. 微博的自定义Android,Live/AndroidSDK
  5. oracle出生天数,oracle宝宝出生天数日历
  6. 关系模式中的各种码(键/关键字)
  7. 【Unity3D】解决封装Debug后双击日志跳转位置不正确问题
  8. fmx 获取全局消息之消息传递
  9. 【观察】对话新华三张鹏:疫情防控“常态化”之下,城市治理现代化的趋势与思考...
  10. linux忘记密码无法登陆/修改密码