前言
Java启动后作为一个进程运行在操作系统中,该进程要分配的内存有以下几个:
1、Java堆:
存储java内存区域,堆大小是在jvm启动时就像操作系统申请完成,其中 -Xmx和-Xms 分别表示了最大大小和初始大小。堆大小分配完成后就已经固定并属于java的gc管理。
2、线程:
jvm运行的实际程序的实体是线程,jvm在创建线程会为其分配一个堆栈大小。如果线程数大于了CPU的核数就会导致高内存和低效率。
3、类和类加载器:在堆的永久代保存了类和类加载器,同样他们本身需要占用内存。
4、NIO:
java1.4后面出现了NIO类库,一种基于通道和缓冲来执行IO的新方式,主要使用了java.io.ByteFuffer的allocateDirect()方法去分配内存。区别于传统io,该方式网络或者磁盘的数据交互都是直接在操作系统的内核空间直接发生,免去了拷贝到jvm空间和java堆上切换的耗时。
5、JNI:
java本地语言调用,实际上java运行时,诸如文件、网络、io或者其他的硬件调用都需要用到jni,所以jni也是需要占用内存。
JVM内存结构
- PC寄存器 (线程私有) 线程执行的行号指示器
- java虚拟机栈(线程私有)java方法执行的内存模型
- java堆 (线程共享)垃圾堆
- 方法区 (线程共享 ,永久代) ,类信息、常量、静态变量、编译后的代码等数据,虚拟机规范中堆的逻辑部分,别名Non-Heap(非堆)用以区分
- 本地方法区 (native方法)为jvm执行Native方法服务
- 运行时常量池(字面量 符号)ps:了解下String.inter()方法