JVM内存分为5块,其中1--3为线程隔离,4、5为线程共享。
线程隔离:
1、程序计数器:分支,循环跳转、异常处理、线程恢复等作用(唯一一个没有规定outofmemoryError的内存区)。
2、VM stack,虚拟机栈:主要用来存放局部变量表(八种基本数据类型,对象引用也就是对象地址)。
3、本地方法栈:与VM stack相似,但不同的是VM stack为JVM执行java方法服务,本地方法栈为JVM执行Native方法服务。
线程共享:
4、堆:存放对象实例(垃圾收集器管理的主要区域,也叫GC堆)。
5、方法区:存储已经被加载的类信息、常量、静态变量等。
直接内存概念:
不是JVM运行时内存,也不是JVM定义的内存区域,就是堆外单独的一块内存区域。
例如:NIO(new input/output),基于通道与缓冲区结合的I/O方式,可以用native函数库直接堆外分配内存,通过一个存 储在堆中的DirectByteBuffer对象作为这块内存的引用进行操作,这样能在一些场景中提高性能。