堆栈内存相关的,当需要new大量对象时需要关注内存溢出问题,而栈一般来说不会溢出,但不排除当你递归深度太大也会报StackOverFlow
补充说明:栈,主要存放引用和基本数据类型;堆,用来存放new 出来的对象实例,包括对象变量以及对象方法。
java中很少自己操作堆栈,除非对性能有严格要求的情况下,例如netty的内存管理。但深刻理解堆栈的区别,有助于写出更优秀的程序。
栈是跟着线程的,每个线程有一个栈。而堆只有一个,一个jvm只有一个堆内存。
栈也是线程私有的,生命周期与线程相同。java中广义的栈,指的就是此处内存。
每个方法在执行时,都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每个方法调用到执行完毕,都对应一个栈帧在虚拟机栈中入栈出栈的过程。
首先,堆和栈和CPU没有关系,也不是我们能使用的,我们开发中没有操作堆和栈的权利;堆和栈是Java虚拟机的内存模型中的两种不同的内存模型,各自有自己的作用。其次,堆是虚拟机存放Java对象的地方,所有我们代码中new的对象都存在堆内存中的,而方法中定义的变量即赋值语句左侧的变量都是存在栈中的。栈的作用是实现Java方法调用的内存模型。最后,堆是所有线程共享的内存区域,所以堆中对象的并发访问可能会涉及同步问题,而栈是线程私有的,Java虚拟机会为每个创建的线程都分配一个线程栈的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。