ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

JVM内存探秘:栈与堆的存储之道

JVM内存探秘:栈与堆的存储之道 栈Stack和堆Heap是 JVM 运行时内存中的两个重要区域存放不同类型的数据。生活类比栈 书桌上正在看的书 用完就收走堆 书架上长期存放的书 需要时去取1. 栈栈主要用于存储方法执行过程中的局部变量、方法参数、操作数以及方法调用信息。每调用一个方法JVM 就会在当前线程的栈中创建一个栈帧Stack Frame方法执行结束后栈帧就会被弹出。例如public void test() { int a 10; int b 20; int c a b; }这里a、b、c这些局部变量会存放在当前线程的栈帧中。栈有几个特点线程私有每个线程都有自己的 JVM 栈方法调用对应栈帧的入栈和出栈生命周期一般跟随方法调用访问速度比较快栈空间有限递归过深可能出现StackOverflowError2. 堆堆主要用于存放对象实例和数组也是 Java GC垃圾回收器主要管理的区域。例如User user new User();这里user这个引用变量在栈帧中new User()创建出来的User 对象在堆中堆的特点线程共享主要存放对象和数组由 JVM 的垃圾回收器进行管理一般比栈大很多如果堆内存不足可能出现OutOfMemoryError: Java heap space3. 两者最核心的区别对比栈堆存储内容方法栈帧、局部变量、参数等对象、数组线程线程私有线程共享生命周期通常随方法调用结束由 GC 管理GC不负责主要管理空间相对较小相对较大常见异常StackOverflowErrorOutOfMemoryError追问一句“User user new User()到底哪里在栈哪里在堆”回答user是局部变量作为引用存储在当前线程的栈帧中new User()创建的对象实例存储在堆中。栈中的引用指向堆中的对象。
返回列表