内存模型分区
简介
线程持有 | 概述 | |
---|---|---|
程序计数器 | 线程私有 | 当前线程所执行的字节码的行号指示器 |
Java虚拟机栈 | 线程私有 | 方法执行的时候创建栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息 |
本地方法栈 | 线程私有 | 与Java虚拟机栈类似,存储native方法的相关信息 |
方法区 | 线程共享 | 存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据 |
堆 | 线程共享 | 存储创建的对象 |
特殊:本地内存(Native Memory)
从JDK1.7到1.8,方法区的实现由永久代变成了元空间,元空间的部分数据分配在本地内存中。
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
特殊: 直接内存(Direct Memory)
也叫堆外内存,JDK1.4加入了NIO,涉及到堆外内存分配。
可以通过-XX:MaxDirectMemorySize
参数来设置最大可用直接内存,如果启动时未设置则默认为最大堆内存大小,即与 -Xmx 相同。即假如最大堆内存为1G,则默认直接内存也为1G,那么 JVM 最大需要的内存大小为2G多一些。当直接内存达到最大限制时就会触发GC,如果回收失败则会引起OutOfMemoryError。
网友评论