java 内存分配管理_Java如何进行内存分配和管理

.常量池(constantpool)

常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(int,long等)和对象型(string、数组等)的常量值(final),还包含一些以文本形式出现的符号引用。

类和接口的全限定名;

字段的名称和描述符;

方法和名称的描述符;

在程序执行时,常量池会存储在MethodArea(方法区)中,而不是堆中。

一个java虚拟机实例只存在一个堆内存,堆内存的大小是可以调节的,类加载器读取了类文件后,需要把类、方法、常变量(const修饰的变量)放到堆内存中,堆内存分为三部分:

1)PermanentSpace永久存储区

永久存储区是一个常驻内存区域,用于存放jdk自身所携带的ClassInterface的元数据。也就是说它存储的是运行环境必需的类信息,被装载到此区域的数据不会被垃圾收集器回收,关闭java虚拟机才会释放此区域占的内存。

2)YoungGeneration Space新生区

新生区是类的诞生、成长、消亡的区域,新生区又分两部分:伊甸区(Edenspace)和幸存区(Survivorspace),所有的类都是在伊甸区被new出来的。幸存区有两个:0区(survivor0  space)和1区(survivor1space)。当伊甸区的空间用完时,程序再创建对象,虚拟机将对伊甸区进行垃圾回收,将伊甸区中的不再被引用的对象进行销毁,然后将伊甸区中的剩余对象移动到幸存0区,如果幸存0区也满了,将对该区进行垃圾回收,然后移动到1区,如果1区也满了,就会移动到老年区。

3)Tenuregeneration space老年区

老年区保存从新生区帅选出来的java对象。

Java虚拟机中为什么分堆区,栈区?

1)从软件的角度,栈区代表了处理逻辑,而堆代表了数据。分开,使得处理逻辑更为清晰,体现了模块化的思想。

2)虚拟机堆、栈的分离,使得堆中的内容可以被多个虚拟机栈共享(也可以理解为多个线程访问同一个对象,因为虚拟机栈是随着线程的创建而创建的),这种共享的益处很多,一方面提供了一种有效的数据交互方式(如共享内存);另一个方面,堆中的共享常量和缓存可被多有虚拟机栈访问,节省了空间。

--------------------- 本文来自 lin-0410 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lin20044140410/article/details/79060053?utm_source=copy

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值