JVM基础知识之Java堆、方法区

目录

Java堆(Java Heap)

概述

自动管理机制

java堆在程序中的应用

方法区(Method Area)

概述

自动管理机制

对类的生命周期阶段的管理

对常量池的管理

总结

Java堆(Java Heap)

概述

       java堆是JVM中所有线程共享的,是用于存储对象的内存区域,也是JVM所管理的内存中最大,即java堆占用的空间最大,大小可以通过启动JVM时设置-Xmx和-Xms参数来调整,即能够实现扩展

自动管理机制

       java堆是由多个线程共享的,这个特点当然也会带来数据竞争,死锁等并发问题。存在在java堆中的对象是由java垃圾回收器管理的,在一个程序运行的过程中,垃圾回收器会定期扫描java堆中的对象,所以开发者无需手动进行这一操作,比如清理不再被引用的对象。当java堆中的对象占用的内存超出了一定的阈值时,垃圾回收器就会自动触发垃圾回收,即把不再被引用的对象清理掉。我们习惯把这个机制称为自动内存管理机制,我们经常听到的java的健壮性和可靠性,其实就是自动内存管理机制有效地减少内存泄漏和内存溢出体现的。这也是java堆和C语言中的堆的不同之处,C中的堆需要人为手动释放申请的空间

java堆在程序中的应用

       说个更具体的例子,一个java程序会创建多个对象,比如一个电商网站的后端程序需要处理很多信息,比如处理用户订单信息,每个订单信息会包含很多对象:商品对象、用户对象、地址对象等,这些对象就是存储在java堆中,便于程序进行访问和处理。不过这里我想强调一下,java堆中存储的是对象的实例

方法区(Method Area)

概述

       同java的堆一样,也是各个线程共享的内存区域,并且方法区的大小也是在运行时动态分配的,由垃圾回收机制回收不再使用的数据。不同的是,方法区存储的是虚拟机加载的类型信息,常量、静态变量以及即时编译器编译后的代码缓存

自动管理机制

       顾名思义,方法区的管理机制也是自动的。自动过程有很多,比如类的加载、链接、初始化和卸载;常量池的管理;垃圾回收。但也有一些场合是需要程序员,比如当我们需要自定义类加载器来实现对类加载过程的控制;调整虚拟机参数来优化管理机制,用于提升程序的性能和稳定性。

对类的生命周期阶段的管理

       指的是一个类从加载、连接、初始化到卸载的过程。其中会涉及到自动管理的是:加载、连接和初始化阶段,其实卸载阶段也可以理解为是自动管理的。

  • 加载阶段:将类的二进制数据存入内存 ,并在方法区中创建一个class对象来表示这个类。
  • 连接阶段:这个阶段包括验证、准备和解析三个步骤。准备阶段会为类的静态变量分配内存并且初始化。
  • 初始化阶段:当我们人为创建一个类的静态变量和静态代码块时,自动管理机制会为静态变量和静态代码块分配内存。
  • 卸载阶段:在满足一定条件时,虚拟机会卸载这个类,类在方法区的相关数据也会释放。

对常量池的管理

       常量池存储的是各种常量,例如字符串常量,数字常量,类引用。常量池是在程序在编译的时候被确定的,同时保存方法区的常量,虚拟机会管理常量池的加载、解析和存储的过程。其实上述的对类的生命周期阶段的管理、对常量池的管理在结束时都要进行垃圾回收,方法区中有可能存在永久代(Permanent Gernation),虚拟机会对永久代进行垃圾回收。

总结

       总之Java堆和方法区都是内存的一段区域,有各自要存储的内容,都是自动管理机制但又具体由各自的特点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值