Java自动内存管理机制

本文详细介绍了Java的自动内存管理机制,包括内存区域(如程序计数器、虚拟机栈、本地方法栈、堆、方法区等)、垃圾收集器的工作原理、对象的死亡判断标准、内存分配策略(如对象优先在Eden分配、大对象直接进入老年代等),以及内存回收算法(如标记-清除、复制、标记-整理、分代收集)。通过对不同内存区域的理解和垃圾回收机制的掌握,有助于优化Java应用的性能和避免内存溢出问题。
摘要由CSDN通过智能技术生成

自动内存管理机制

1. Java内存区域与内存溢出异常

1.1. 运行时数据区域

(1) 程序计数器:程序计数器用来记录当前线程执行的字节码行号。程序计数器是线程私有的,因为CPU通过时间轮转来为线程服务,为了线程切换后能够恢复的正确的位置,在每一个线程都保存一个程序计数器。如果执行的是本地方法则,程序计数器值为空。

(2) Java虚拟机栈:Java虚拟机栈是Java方法的内存模型,每一个方法被执行的过程都会创建一个栈帧用来存储局部变量表、操作栈、动态链接、方法出口等信息。局部变量表所需的内存空间是在编译时期分配的。Java虚拟机栈是线程私有的。如果申请的栈深度超过了虚拟机允许的最大栈深度会抛出Stack OverflowError。如果允许扩展时,当扩展时无法申请足够的内存会抛出OutOfMemoryError。使用-Xss来设置栈大小。

(3) 本地方法栈:与Java虚拟机栈相似,只不过是为本地方法服务的。

(4) 堆:Java堆是内存中线程共享的一块区域,在Java虚拟机启动的时候创建的。Java中的所有对象和数组都要在堆上分配。堆内存是GC的主要区域。由于GC是按代回收,所以堆还可以被细分为新生代和老年代。新生代又可以被细分为EdenFromSurvivorToSurvivor区域。使用-Xms-Xmx来设置堆的下限和上限。如果堆内存中没有足够的空间完成实例分配,并且也没法扩展就会抛出OutOfMemoryError异常。

(5) 方法区:是线程共享的一块区域。主要用来存储已被加载的类信息,常量,静态变量,即时编译器编译的代码。方法区一般被成为永久代,在这个区域也会进行垃圾回收,主要回收的是常量池,和对类型的卸载。方法区会出现OutOfMemoryError异常。使用-XX:PermSize

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值