首先看图有个大概的了解,Java运行时内存是如何划分的,本篇主要讲堆和栈
栈(Stack)分为:虚拟机栈和本地方法栈,我们一般说的栈就是虚拟机栈。
- 虚拟机栈随着方法运行创建,从方法运行到执行完成的过程对应着入栈和出栈的过程。
- 虚拟机栈线程私有,它的生命周期与线程相同。
虚拟机栈为虚拟机执行Java方法(字节码)服务,本地方法栈为虚拟机使用到的Native方法服务,两者发挥作用相似,在使用的语言,方式和数据结构层面也无区别。sun公司的HotSpot虚拟机就将这两个合二为一。
native方法在哪里会用到呢?
比如获取对象的哈希码(HashCode)就是用native方法
堆(Heap)是Java虚拟机中内存最大的一块。
- 在虚拟机启动时创建,被所有线程共享。
- 存放对象实例,但不是所有的对象都存放在堆中,如果不断的创建对象就会导致内存溢出。
- 常见异常:内存溢出,内存泄漏
小tips:我们在运行tomcat时会设置-Xmx和-Xms,这两个值就是在设置堆内存