Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,都有各自的用户级创建销毁时间。
堆区和方法区是随着虚拟机进程的启动一直存在的.
虚拟机栈、本地方法栈和程序计数器是依赖用户线程的启动和结束而创建和销毁的。
堆 [所有线程共享]
堆区是JVM管理的内存中最大的一块,“几乎”所有的对象实例都在这里分配内存。
堆区里面又区分有新生代、老年代。
新生代里又包含1个Eden区和2个survivor区【From survivor, To survivor】,
堆里的细分是为了更好的分配和回收内存。
方法区 [所有线程共享]
主要用于存储加载的类型信息、常量、静态变量和即时编译器编译后的代码缓存等数据。
在JDK8中已经把里面的永久代给废弃了,改用本地内存的元空间,这样就能加载更多的类型信息。
运行时常量池
用于存放编译期生成的各种字面量与符号引用。
虚拟机栈 [线程私有]
这个也就是我们经常说到的栈区。在每个方法执行的时候都会同步创建一个栈帧,每个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法的执行就相当于是压栈和出栈,在每一个方法执行完毕后其对应栈内的数据也就随之被回收了。