Java内存模型 线程公有方法区:Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的 类信息。比如类的字段、方法、常量池等。方法区的大小决定系统可以保存多少个类。如果 系统定义太多的类,导致方法区溢出。虚拟机同样会抛出内存溢出的错误。方法区可以理解 为永久区。堆 虚拟机栈局部变量表 运行时常量池 操作数栈主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间 动态连接 方法返回地址 本地方法区 程序计数器 堆讲解有限分配Eden区-->空间分配担保机制 大对象直接进入老年代-->避免在Eden区和Survivor区之间产生大量的内存复制 对象晋升年龄阀值 --> -XX:MaxTenuringThreshold, 默认15 动态年龄判定 --> 然而VM并不总是要求对象的年龄必须达到 MaxTenuringThreshold才能晋升老年代: 如果在Survivor空间中相同年龄所有对象大小的总和大于 Survivor空间的一半, 年龄大于或等于该年龄的对象就可以直接进入老年代, 而无须 等到晋升年龄. 对象生死判定 可达性分析算法 方法区: 类静态属性 Java内存模型是Java虚拟机(JVM)管理内存的核心机制,它定义了程序中各部分如何访问和存储数据。在面试中,理解Java内存模型对于理解程序的性能和避免内存泄漏至关重要。 我们来看Java内存模型的主要组成部分: 1. **方法区(Method Area)**:也称为永久代,它存储类的元数据,如类的字段、方法、常量池等。方法区是线程共享的区域,其大小决定了系统能够加载多少个类。如果方法区溢出,JVM会抛出内存溢出异常。 2. **堆(Heap)**:堆是JVM中最大的一块内存区域,用于存储对象实例。堆被所有线程共享,并且分为新生代和老年代,用于不同生命周期的对象分配。 - **新生代(Young Generation)**:对象首先被分配到新生代,分为Eden区和两个Survivor区。有限分配机制意味着大部分对象会在Eden区创建,然后通过Minor GC进行存活对象的筛选。 - **老年代(Old Generation)**:经过多次 Minor GC 仍存活的对象会被转移到老年代。大对象可以直接进入老年代以避免频繁的内存复制。对象晋升的年龄阀值可以通过 `-XX:MaxTenuringThreshold` 参数设置,或者通过动态年龄判定策略调整。 3. **虚拟机栈(Java Virtual Machine Stack)**:每个线程都有自己的虚拟机栈,用于存储局部变量表、操作数栈、动态链接、方法返回地址等信息。 4. **局部变量表(Local Variable Table)**:存储方法参数和局部变量,每个栈帧包含一个局部变量表。 5. **运行时常量池(Runtime Constant Pool)**:包含类和接口的常量,以及方法和字段的引用。 6. **操作数栈(Operand Stack)**:执行计算过程的中间结果,也是临时变量的存储空间。 7. **动态连接(Dynamic Linking)**:处理方法调用的过程。 8. **方法返回地址(Return Address)**:标识方法执行完毕后的跳转位置。 9. **本地方法区(Native Method Stack)**:用于支持JNI(Java Native Interface)调用C/C++等本地方法。 10. **程序计数器(Program Counter Register)**:记录当前线程所执行的字节码指令的地址。 垃圾回收(Garbage Collection, GC)是Java内存管理的关键部分,主要目标是自动回收不再使用的内存空间,以防止内存泄漏。常见的垃圾回收算法包括: 1. **引用计数**:简单但无法处理循环引用问题。 2. **复制算法**:主要用于新生代,将存活对象复制到另一块内存区域。 3. **标记清除算法**:标记不再使用的对象并清理空间,会产生碎片。 4. **标记整理算法**:标记后将存活对象向一端移动,整理内存空间。 垃圾回收器的选择对程序性能有很大影响,常见的包括: 1. **Serial收集器**:单线程,适合小型应用,使用-XX:+UseSerialGC启用。 2. **ParNew收集器**:ParNew是Serial的多线程版本,常与CMS配合使用。 3. **Parallel Scavenge收集器**:关注吞吐量,自适应调节策略,是JDK 1.8默认的新生代收集器。 4. **CMS(Concurrent Mark Sweep)收集器**:并发标记清除,减少STW(Stop-The-World)时间。 5. **G1(Garbage-First)收集器**:新一代垃圾收集器,目标是整体停顿时间的控制。 理解这些概念对于解决性能问题、优化代码和面试准备都至关重要。在面试中,深入理解这些知识点可以展示你的专业技能和解决问题的能力。
剩余21页未读,继续阅读
- 粉丝: 2359
- 资源: 6186
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助