6.2--java 的内存划分及杂谈

 

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

java 的内存划分

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

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

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

如下图所示:

 

v2-ec53a6527ed16fdd7ea459b7b5c91ff5_b.jpg

下面以数组为例来分析:

 

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

 

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

 

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

 

v2-8b92c37bd774b4cb355700f7700a2e61_b.jpg

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

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

 

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

 

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

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

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

 

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

学习大纲

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

 

v2-0d240c8044a2c78f05576184b04831f6_b.jpg
  • 每一个树枝知识块都是不可或缺的,一起加油吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值