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出来的对象和数组,堆是通过垃圾回收器来管理内存的,动态分配内存大小,运行速度慢。

注释

可能不是很好大家多多谅解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值