Java 程序启动后作为一个进程运行在操作系统中,那么这个进程有哪些部分需要分配内存?
1 Java 堆
Java 堆用于存储 Java 对象,堆的大小在 JVM 启动时向操作系统一次性申请完成,通过 - Xmx 和 - Xms 来控制大小.其中,Xmx 表示堆的最大值,Xms 表示堆的初始值.一旦分配完成,堆的大小就固定了,不能在内存不够时再向操作系统重新申请,同时当内存空闲时也不能将多余的空间交还给操作系统.
2 线程
JVM 运行实际程序的实体是线程,而线程需要内存来存储数据.每个线程创建时 JVM 都会为它创建一个堆栈,堆栈的大小因 JVM 实现的不同而不同.
3 类和类加载器
类和类加载器存储在堆中,该区域称为永久代(PermGen 区).JVM 按需加载类,只会加载一个类到内存一次.
4 NIO
jdk1.4 以后引入了基于通道和缓冲区执行 I/O 的新方式 NIO,使用 java.nio.ByteBuffer.allocateDirect() 方法分配本机内存而不是 Java 堆上的内存.
5 JNI
JNI 使本机代码(如 C 语言程序)可以调用 Java 方法.实际上,Java 运行时本身依赖 JNI 来实现类库功能,所以 JNI 会增加 Java 运行时的本机内存占用量.
参考资料
《深入分析 Java web 技术内幕》 P201-203
来源: http://www.bubuko.com/infodetail-2456693.html