Java基础06(代码运行时的内存图)
目录
一、引入
二、Java下的内存分配
1.类信息常量池和静态常量池
2. 栈和字符串常量池
(引进)线程
3.⭐程序计数器作用⭐(程序计数器配合栈使用)
总结Java内存:
(引进)驱动
三、引用传递和值传递
值传递:Java,C,C++
引用传递和值传递的具体应用场景:
引用传递和值传递的优缺点:
一、引入
进程都是在内存中独占一块空间互不干扰:
操作系统就是C语言写的(硬件驱动是C语言,相互适配可以达到更优速度,所以操作系统也是C语言编写),所以操作系统只认识C语言,其他高级语言最终也会被翻译成C语言,即能在操作系统上运行的语言,本质上都被转化成C语言了。
不管何种语言,本质上都是通过C语言向操作系统申请足够大的一段数组,如下Java版本(指针划分):
二、Java下的内存分配
1.类信息常量池和静态常量池
【如上所示:静态可以被非静态调用(静态常量池内的静态方法和变量相当于设计图中已经被造好的零件,可以直接使用);非静态能被非静态调用(非静态相当于图纸设计图,互相能够'摘抄'调用),但是非静态不能被静态调用(即:图纸不能被零件调用)】
2. 栈和字符串常量池
一个方法被调度时,入栈,当这个方法位于栈首时,则将处于运行状态,否则不会运行,当且仅当其处于栈首时,才会再次运行;
方法被调用进栈,是被拷贝一份进栈,而不是直接存入栈;
String和int类型不同,String类型的句柄和值不在一块,这是因为一旦String类型的值发生改变,其内部所占用内存也会发生改变,但是int类型不管如何变动,都是32bit;
如图表示,Person类中的静态方法相当于只有一份固定放在静态常量池,而非静态方法(相当于图纸),被new多少次,就有多少份;
静态方法可以通过类.或方法名.调用,非静态方法只能通过方法名.的方法调用;
一个对象在内存中实际(左图和右图):
其他地方申请的空间会被Java摧毁自动回收,但是常量池中的不会,具体参见这篇文章--->一篇帮你搞懂Java常量池-CSDN博客
(引进)线程
进程是由线程组成的,线程是-->依托栈结构,完成了一条线的方法的调用;线程的组成单位是方法。
3.⭐程序计数器作用⭐(程序计数器配合栈使用)
- 控制指令顺序:程序计数器用于控制指令的执行顺序。它指示计算机在其指令序列中的位置,确保指令按顺序执行。
- 存储下一条指令的地址:程序计数器存储下一条指令的地址,确保CPU能够正确地获取和执行下一条指令。
- 在中断时保存当前指令:当发生中断时,程序计数器会保存当前正在执行的指令的地址,以便在中断处理完毕后能够恢复到中断前的状态,继续执行程序。
- 程序计数器的工作原理:
- 程序计数器在每个指令执行完毕后会自动增加,指向下一条指令的地址。如果发生跳转或分支,程序计数器的值会由转移指针给出新的指令地址。程序计数器确保CPU能够连续地执行指令,实现程序的顺利运行。
总结Java内存:
(引进)驱动
程序的运行离不开硬件,硬件的运行离不开驱动。
三、引用传递和值传递
传递有引用传递(e.g句柄的地址的传递)和值传递(e.g对象地址的传递)
值传递:Java,C,C++
- 引用传递(Pass by Reference)是指在调用函数时将实际参数的地址传递到函数中,这样在函数中对参数所进行的修改,将影响到实际参数。这意味着多个变量可以通过引用传递共享同一个内存地址。
- 值传递(Pass by Value)是指在调用函数时将实际参数的值复制一份传递给函数,这样当函数对形参进行修改时,不会影响到实际参数。每个变量都有自己的内存地址,互不影响。
引用传递和值传递的具体应用场景:
- 引用传递适用于需要修改传入参数的情况,例如在需要返回多个结果或者需要对传入参数进行修改时。值传递适用于不需要修改传入参数的情况,例如在只需要读取数据时。
引用传递和值传递的优缺点:
- 引用传递的优点是可以直接修改传入参数,减少数据复制的开销。缺点是需要注意避免对传入参数的意外修改。值传递的优点是传入参数不会被修改,安全性高。缺点是需要复制数据,可能会增加开销