2.1概述:如果不了解虚拟机是怎样使用内存的,那么排查错误将会成为一项异常艰难的工作。
2.2 运行时数据区域
java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据库区域。
这些区域都有各自的用途,以及创建和销毁的世界,有的区域随着虚拟机进程的启动而存在,
有些区域则依赖用户现场的启动和结束而建立和销毁。
程序计数器(线程私有的):
当前线程所执行的字节码的行号指示器。
java虚拟机栈(线程私有的)
java方法执行的内存模型
每个方法执行的同时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息
本地方法栈(与虚拟机栈所发挥的作用类似)
虚拟机使用到的Native方法时,使用到。
java堆(所有线程共享)
在虚拟机启动时创建,
作用:存放对象实例
细分:新生代和老年代,Eden恐惧、From Survivor、To Survivor。
内存分配角度:线程共享的java堆中可能怀芬出多个线程私有的分配缓冲区。
方法区(所有线程共享)
作用:存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
有的JDK,会把GC分代收集扩展至方法区,或者说使用永久代来实现方法区。
运行时常量池
运行时常量池是方法区的一部分。
直接内存
并不是虚拟机运行时数据区的一部分。
jdk1.4中新加入了NIO类,引入了一种基于通道与缓冲区的I/O方式,
它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆中的DirectByteBuffer对象作为这块
内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。