JVM内存管理
- JVM内存管理
- Java中哪里需要内存
- 1Java堆
- 2Java栈
- 3类和类加载器Jvm是按需加载
- 4NIO
- 5JNI
- JVM中的内存结构
- Jvm的内存分配堆栈
- 栈内存
- 堆内存
- 注释
Java中哪里需要内存
在Java中很多组件都需要内存如:堆,栈,线程,类和类加载器,NIO,JNI等。
1、Java堆
堆是用来存储Java对象的内存区域,大小在 Jvm启动时就已经申请完成了。
可以另行配置: -Xmx:最大空间, -Xms:初始化大小
在堆中内存空间管理是Jvm来控制,对象创建由Java程序控制,对象所占的空间释放由管理堆内存的垃圾回收器机制(GC)来完成,根据算法不同,回收方式和时机都不同。
2、Java栈
Jvm运行实际程序的实体是线程,线程需要空间来存储一下必要的数据,每一个线程创建。
Jvm都会为其创建一个堆栈,大小根据不同的Jvm实现而不同。
3、类和类加载器:Jvm是按需加载。
在Sun JDK中类和类加载器也存在堆中,该区域被称为:永久代(PermGen区)。
通常情况下Jvm只会加载一个类到内存一次,如果自己实现的ClassLoader就没准了。可能会出现PermGen内存泄漏。
4、NIO
它通过java.nio.ByteBuffer.allocateDirect()方法来分配内存。它是使用本机的内存,并不是Java堆上的内存。
ByteBuffer产生的数据如果和网络或者磁盘交互,都在操作系统的内核空间发生,不需要复制到Java内存中,这种io操作要比Java堆上的操作快很多。并且ByteBuffer会自动清理本机缓冲区。
5、JNI
该技术使得本地代码可以调用Java方法,实际上Java程序运行时,可依赖于JNI代码来实现类库功能的,比如文件操作,网络IO等。
JVM中的内存结构
Jvm按照运行时数据的存储结构来划分内存结构,在运行Java程序时,分成几种不同格式的数据
1、寄存器:是运行速度最快的区域,由处理器直接管理,程序并不能操作,存储的好像是运行时数据区。
2、Java堆栈:仅次于寄存器的速度,位于RAM,数据必须知道生命周期和大小等属性,所以指针向上释放空间,向下占据空间,不是特别灵活,主要存放基本数据类型和引用。
3、Java堆:位于RAM,不需要知道存储数据的生命周期等,只需要直接存数据即可,存放对象和数组。因为垃圾回收器在无需担心空间问题。
4、方法区:存储常量、静态变量、即时编译器编译后的代码等数据,该区域是所有线程共享的,所有考虑线程安全问题。
5、本地方法区:貌似是调用C或者C++等本地方法的。其他作用不是很明白。
6、运行时常量池:方法区的一部分,所有线程共享。虚拟机加载Class后把常量池中的数据放入到运行时常量池。
Jvm的内存分配(堆、栈)
栈内存
它是用来存储基本数据类型和对象的引用,栈内存的分配是和线程绑定在一起的,存储速度比堆要快,仅次于寄存器,不过需要知道变量的具体大小和生存期。不是灵活。
堆内存
它是共享数据区,用来存储new出来的对象和数组,堆是通过垃圾回收器来管理内存的,动态分配内存大小,运行速度慢。
注释
可能不是很好大家多多谅解。