JAVA内存机制

        Java 内存机制是 Java 程序运行的基础,主要包括内存分配和内存回收两部分,它管理着程序运行时的内存使用,确保程序的高效稳定运行。

 1.内存区域划分

  • 程序计数器:是一块较小的内存空间,每个线程都有独立的程序计数器。它记录当前线程所执行的字节码的行号,用于线程切换后能恢复到正确执行位置,在多线程并发执行时至关重要。
  • Java 虚拟机栈:每个线程在创建时都会创建一个虚拟机栈,它由多个栈帧组成。栈帧用于存储方法的局部变量表、操作数栈、动态链接和方法出口等信息。当方法调用时,一个新的栈帧被压入栈顶,方法执行结束后,栈帧被弹出。
  • 本地方法栈:与 Java 虚拟机栈类似,不过它是为虚拟机使用到的本地(Native)方法服务的。
  • 堆:是 Java 内存管理的核心区域,是所有线程共享的一块内存。几乎所有的对象实例和数组都在堆上分配内存,堆的大小可以通过 JVM 参数进行调整。根据对象的生命周期和使用频率,堆又被细分为新生代和老年代。新生代存放新创建的对象,老年代存放经过多次垃圾回收后仍然存活的对象。
  • 方法区:也是所有线程共享的区域,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在 JDK 8 及以后的版本中,方法区被元空间(Metaspace)取代,元空间使用本地内存,减少了内存溢出的风险。

2.内存分配策略

  • 对象优先在新生代分配:新创建的对象通常会首先在新生代的 Eden 区分配内存。当 Eden 区空间不足时,会触发 Minor GC(新生代垃圾回收),存活的对象会被移动到 Survivor 区(其中一个)。
  • 大对象直接进入老年代:如果对象体积过大,超过了新生代的空间限制,会直接在老年代分配内存,这样可以避免在新生代频繁进行垃圾回收,提高性能。
  • 长期存活的对象进入老年代:对象在新生代经过多次垃圾回收后仍然存活,会逐渐晋升到老年代。每次垃圾回收后,对象的年龄会增加,当达到一定阈值(默认 15)时,就会被转移到老年代。

3.内存回收机制(垃圾回收,GC)

  • 引用计数法(不常用):为每个对象添加一个引用计数器,每当有一个地方引用该对象时,计数器加 1;引用失效时,计数器减 1。当计数器为 0 时,对象可被回收。但这种方法无法解决循环引用的问题,所以在 Java 主流的垃圾回收器中未被采用。
  • 可达性分析算法:通过一系列的 “GC Roots” 对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。如果一个对象到 GC Roots 没有任何引用链相连,则证明此对象是不可用的,可以被回收。常见的 GC Roots 包括虚拟机栈中局部变量表指向的对象、方法区中的类静态属性引用的对象、常量池引用的对象、本地方法栈中 JNI 引用的对象等。
  • 垃圾回收器:Java 提供了多种垃圾回收器,如 Serial 回收器、ParNew 回收器、Parallel Scavenge 回收器、CMS 回收器、G1 回收器等。不同的回收器适用于不同的场景,例如 Serial 回收器是单线程的,适用于小型应用;G1 回收器适用于大内存、多处理器的应用场景,能够更高效地处理垃圾回收,减少停顿时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值