java 内存结构分为:
堆
栈
方法区
本地方法栈
程序计数器
堆
所有的对象和数组都要在堆上进行分配.
线程共享.
垃圾回收发生的区域.
堆的优势是可以动态分配内存大小, 缺点是存取速度较慢.
栈
当创建一个线程的时候, JVM 就会为这个线程创建一个栈. 每个方法在执行的时候, 会创建一个栈帧, 用于存储方法内部变量, 操作栈和方法返回值等, 方法执行完成时, 这个栈帧会被清除.
栈是与线程对应的, 这个数据不是线程共享的.
存取速度比堆快, 缺点是, 存在栈中的数据大小和生存期是确定的, 缺乏灵活性.
方法区
用于存储类结构信息的地方, 包括常量池, 静态变量, 构造函数等. 虽然 JVM 规范把方法区描述为堆的一个逻辑部分, 但它却有个别名 non-heap(非堆). 方法区还包含一个运行时常量池.
线程共享.
本地方法栈
和 java 栈的作用差不多, 只不过是为 JVM 使用到的 native 方法服务的
程序计数器
用于保存当前正在执行的程序的内存地址. Java 程序是多线程执行的, 线程交叉执行的时候, 被中断的线程当前执行到哪的内存地址必然要保存下来, 便于线程恢复执行时, 继续在被打断的地方执行.
来源: https://juejin.im/post/5c8762b95188257e2205b6b1