JVM数据区域
首先,让我们对运行时Java虚拟机数据区域中堆,堆栈和方法区域中存储的数据进行汇总,如下所示:
然后让我们详细分析堆和堆栈。
堆
堆是存储单位。对于大多数应用程序,此区域是JVM管理的最大内存块。线程共享主要用于存储对象实例和数组。
堆栈
堆栈是运行时的单位,是Java虚拟机堆栈,线程是私有的,并且生命周期与线程一致。描述Java方法执行的内存模型:每个方法在执行时都会创建一个堆栈框架,以存储诸如局部变量表,操作数堆栈,动态链接,方法出口等信息。从调用到执行结束的每个方法都对应于从虚拟机堆栈到堆栈的堆栈帧的过程。
局部变量表:存储编译时已知的各种基本类型(布尔,字节,字符,短型,整数,浮点型,长型,双精度型),对象引用(引用类型)和returnAddress类型(指向字节的代码地址)说明)
堆与栈的比较

一、堆栈解决了程序的运行问题,即如何执行程序或如何处理数据;堆解决了数据存储的问题,即如何放置数据以及将数据放置在何处。
因为二、堆栈是一个运行单元,所以其中存储的信息是与当前线程有关的所有信息。包括:局部变量,程序运行状态,方法返回值等;堆仅负责存储对象信息。
三、在方法的堆栈和对象引用变量中定义了一些基本类型的变量。堆内存用于存储new创建的对象和数组。
四、在Java中,线程将具有与之相对应的线程堆栈,从而确保程序的并发操作。
所有线程共享堆。也可以理解为访问同一对象的多个线程,例如用于读取和写入同一对象的值的多线程
五、堆栈内存溢出包括StackOverflowError和OutOfMemoryError。 StackOverflowError:线程请求的堆栈深度大于虚拟机允许的深度。 OutOfMemoryError:如果虚拟机堆栈可以动态扩展,并且在扩展期间无法申请足够的内存;堆内存溢出是OutOfMemoryError。如果堆中没有内存来完成实例分配,并且无法再扩展堆,则会引发OutOfMemoryError异常。
代码分析
最后,使用在Internet上看到的示例来帮助了解堆栈内存和堆内存的存储:

对于以上代码,date是局部变量,i,d,m和y都是形式参数作为局部变量,而day,month和year是成员变量。让我们分析执行代码时的更改:
1.主
该方法开始执行:int date = 9;
日期
局部变量,基本类型,引用和值都存储在堆栈中。
2. Test test = new Test();
测试
是对象引用,存储在堆栈中,而对象(新Test())存储在堆中。
3. test.change(date);
调用change(int i)方法,i是局部变量,并且引用和值存储在堆栈中。当执行方法更改时,我将从堆栈中消失。
4.出生日期d1 =新的出生日期(7,7,197 0);
调用BIrthDate类的构造函数以生成一个对象。
d1是一个对象引用,存储在堆栈中;
对象(新的BirthDate())存储在堆中;
其中d,m,y是存储在堆栈中的局部变量,其类型是基本类型,因此它们的数据也存储在堆栈中;
day,month,year是BirthDate对象的成员变量,它们存储在存储在堆中的新BirthDate()对象中;
执行BirthDate构造方法时,d,m和y将从堆栈中消失。
5.执行main方法之后。
日期变量test,d1参考将从堆栈中消失;
新的Test(),新的BirthDate()将等待垃圾收集器收集。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-358181-1.html
谁占领钓鱼岛谁实力强
如果他要耍赖
质检总局都买到假货