(大白话)堆,栈,虚拟内存

堆:存在于进程中

栈:依附于线程

堆:从操作系统为进程分配的4G内存中划分出来的,从低地址开始放,大小可变,在进程启动的时候会同时启动一个主线程(执行Main方法),并且分配一块内存空间(线程空间)
栈:线程生来就是用来执行代码的,不同的线程拥有各自的栈,在各自的线程空间之中


虚拟内存:(从两个角度看)
1.从物理上来看:物理内存+虚拟内存《将硬盘当成内存使用》--我们日常电脑在运行时有时候会提示虚拟内存不够,我们就会在我的电脑右键的选项中设置虚拟内存,将硬盘当内存使
2.从操作系统内存管理上来讲:Windows操作系统为每个进程分配4G的虚拟内存

进程:
一个应用程序就是一个进程
线程运行的进程中

****只有代码运行起来才会对应真正的物理内存,所以不用担心内存不够用的《代码要一行一行执行》****

### JVM内存模型的通俗解释 JVM内存模型是Java虚拟机在运行时如何分配和管理内存的规范[^1]。它描述了Java程序运行时,内存是如何被划分为不同的区域以及这些区域的作用。 #### 1. JVM内存模型的主要组成部分 JVM内存模型可以分为以下几个主要部分: - **方法区(Method Area)** 方法区用于存储已被虚拟机加载的类信息、常量、静态变量以及编译后的代码等数据。在某些JVM实现中,方法区被称为永久代(Permanent Generation),但由于其空间有限,当加载的类过多时,可能会导致`OutOfMemoryError:PermGen space`异常[^3]。 - **(Heap)** 是JVM中最大的一块内存区域,用于存放对象实例和数组。的大小可以通过`-Xms`(最小值)和`-Xmx`(最大值)参数进行设置。默认情况下,当空余内存小于40%时,JVM会增大内存到`-Xmx`指定的大小[^4]。 - **(Stack)** 每个线程都有自己独立的中保存的是局部变量表、操作数、动态链接、方法出口等信息。每个方法执行时都会创建一个帧(Frame),并将其压入中,方法执行完毕后,帧会被弹出。 - **本地方法(Native Method Stack)** 与普通类似,但本地方法为虚拟机使用的Native方法服务。 - **程序计数器(Program Counter Register)** 程序计数器是一个较小的内存区域,用于记录当前线程所执行的字节码指令的位置。如果是执行Java方法,则记录的是JVM字节码指令地址;如果是执行本地方法,则为空。 #### 2. JVM内存模型的工作原理 JVM通过将Java代码编译成字节码,并在运行时解释或编译成机器码来执行。对于“热点”代码,JVM会采用即时编译(JIT)技术,将字节码编译为本地机器码并缓存起来,从而提高执行效率[^5]。 #### 3. 内存分配与垃圾回收 JVM中的内存是垃圾回收的主要区域。对象的分配通常发生在上,而垃圾回收机制则负责回收不再使用的对象,释放内存空间。如果内存不足且无法扩展,JVM会抛出`OutOfMemoryError`异常。 ```python # 示例:触发OutOfMemoryError try: while True: list = [] for i in range(1000000): list.append("Test") # 不断分配内存 except MemoryError as e: print(f"内存不足: {e}") ``` #### 4. 平台无关性 JVM屏蔽了底层操作系统的差异,使得Java程序只需生成针对JVM的字节码,就可以在不同平台上运行,实现了“一次编译,到处运行”的目标[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值