大家好呀,我是大成子。今天主要讲一下 java 中内存划分这块知识点,然后整理一下学习的大纲,对后面的知识学习有一个整体的展望和把握。

  • java 内存 5 个区域的划分
  • ++在前和++在后的区别
  • 学习大纲

java 的内存划分

java 的内存需要划分为五个部分,内存其实就是你计算机当中的内存条,任何应用程序,如果想要运行,都必须为其开辟一块内存空间,那么整体的内存是由你 computer 的操作系统来操控的。java 程序需要运行,就需要申请一块内存。但是申请过来之后,是进行了区域的划分的。这就好比住房,100 平的房子,有主卧,次卧,阳台、厨房、卫生间等,各个区域的作用是不同的。

那么分为哪 5 个部分呢?他们分别是

  • 栈内存(stack):存放的都是方法中的局部变量; 局部变量:方法中的参数,或者是方法{}内部的变量; 作用域:一旦超出作用域,立刻从栈内存当中消失。
  • 堆内存(heap):凡是 new 出来的东西,都在堆当中; 堆内存当中的东西都有一个地址值:16 进制。 堆内存当中的数据都有默认值。规则:
  • 整数:默认为 0;
  • 浮点型:默认为 0.0;
  • 字符型:默认为'\u0000';
  • 布尔:默认为 false * 引用类型:默认为 null
  • 方法区(method area):存储的是.class 相关的信息,包含方法的信息,但方法的运行是在栈当中
  • 本地方法栈:与操作系统相关;
  • 寄存器:与 cpu 相关,性能非常高。

如下图所示:

 




java 内存空间 字符串 java内存空间划分_java 内存空间 字符串


下面以数组为例来分析:

 


java 内存空间 字符串 java内存空间划分_java_02


  • 程序需要运行,需要一个.class的文件,方法区中会保存我们的方法的信息,你这个方法叫什么?返回类型是什么?需要传入什么参数?

 


java 内存空间 字符串 java内存空间划分_面试_03


  • 接着把方法加载到栈内存当中,并且为main方法在栈内存中开辟一块内存空间。进栈之后,开始运行main方法。之后遇到数组,将变量储存在栈当中。
  • 将数组的变量储存在栈当中之后,进行赋值,我们可以看到new int[]{1, 2, 3, 4, 5};new了一个数组,我们前面说过,new出来的东西储存在堆当中,如下图所示:

 


java 内存空间 字符串 java内存空间划分_算法_04


  • 数组变量num实际上赋值的是储存在堆当中的16进制的引用地址。(关于进制和计算机中常见的几种进制 转换和其他的知识点,大成子这里也是很感兴趣,抽空将这里整理出来~)

 


java 内存空间 字符串 java内存空间划分_编程语言_05


面试题之值类型和引用类型有什么区别?

  • 值类型的数据存储在栈当中,引用类型的数据存储在堆当中。我们前面说的java中8中基础数据类型 byte short int long float double char boolean 也被称为四类八种基本的数据类型,也叫值类型数据,它们的值可以直接赋值,所以直接存储在栈(stack)当中;而引用类型,你比如数组,赋值时需要new,所以它的值时储存在堆(heap)中的。
  • 值类型变量间赋值是值拷贝,而引用类型变量间赋值是地址拷贝。这个怎么说呢,我用代码来解释更为直观:值类型我是用int举例,而引用类型我使用数组来举例。

 


java 内存空间 字符串 java内存空间划分_java 内存空间 字符串_06


  • 我定了一个int类型的num1,赋值100,再定义一个int类型的num2,使其赋值等于num1的值,他们之间赋值是基于值拷贝,我更改了num2的值,num1的值不受影响。如上图所示:

 


java 内存空间 字符串 java内存空间划分_面试_07


  • 我定义一个array1数组,并赋值。并将其复制给了array2。接着我试图更改array2第一个元素的值,分别输出array1和array2的第一个元素的值,可发现为相同,都变成了100。如上图所示: 引用类型间的变量间的赋值其实是地址拷贝。两个数组的引用地址指向同一个:[I@1b6d3586 所以当更改其中一个数组的值时,引用了同一个地址的数组,第一个元素也将发生改变。有兴趣的同学可以自己画一画内存图。

面试题之i++和++i的区别?

  • 总结一句,就是,++在前,先加1再xx;++在后,先xx在加1;这里的xx是指运算。举个栗子: 如下图所示:

 


java 内存空间 字符串 java内存空间划分_编程语言_08


  • 这个知识点,一般在开发当中几乎不怎么运用到,而且就算运用到,可读性也不高,仅仅作为面试考察基本知识点使用。

学习大纲

  • 作为一个开发经验近1年的码农来说,我越发觉得基础的重要性和知识树的开枝了,有的时候真的觉得眼界决定思维,思维决定高度,高度决定格局,自己的眼界着实低了些,所以解决什么问题,学习什么东西,要尝试着多角度、从大局思考。
  • 哎,感觉要学的越来越多了,有木有(笑哭表情)
  • 如下图:我简单画了一下脑图(未完待续)


java 内存空间 字符串 java内存空间划分_算法_09


  • 每一个树枝知识块都是不可或缺的,一起加油吧!