`

【Java核心-进阶】JVM 内存区域划分

    博客分类:
  • Java
 
阅读更多



 

注:Virtual 表示已申请,但未真正使用的内存区域(最小堆容量(Xms)不等于最大堆容量(Xmx)时会出现该现象)

 

1. 程序计数器

PC,Program Counter Register

  • 存放线程当前所执行方法的指令地址
    • 如果当前执行的是本地方法,而非 Java方法,则为 undefined (未指定值)
  • 每个Java线程都有一个程序计数器
  • 任何时间,一个线程只有一个方法在执行——当前方法

2. Java虚拟机栈

  • 每个Java线程都有一个 Java虚拟机栈
  • 栈中每个单元——栈帧——对应一次Java方法调用
  • 与程序计数器对应,任何时间点,一个栈只有一个活动的栈帧——当前栈帧
  • 执行新方法时,创建新的栈帧并入栈;方法结束时,对应的栈帧出栈
  • 栈帧存放:局部变量表、操作数栈(operand)、动态链接、方法退出的定义(正常退出或异常退出)

3. 本地方法栈

  • 与Java虚拟机栈类似
  • 用于支持本地方法的调用
  • 每个线程都有一个本地方法栈
  • Oracle Hotspot JVM 中,本地方法栈 与 Java虚拟机栈 是同一片区域

4. 堆

  • 存放 Java对象实例
    • Oracle Hotspot JVM 会将所有 Java对象都存放在堆中
    • Intern 字符串缓存 和 静态变量 都存放在堆中 (Oracle JDK 8)
  • 所有线程共享堆
    • 除了TLAB,Thread Local Allocation Buffer。这是大部分JVM具体实现的一个设计
  • 垃圾收集器(GC)不同,堆的具体划分方式也不同
    • 本文主要涉及JDK8的典型设置

4.1 新生代

大部分对象会在该区域创建、销毁。

4.1.1 Eden

对象一般会先被创建分配在Eden区

4.1.1.1 TLAB, Thread Local Allocation Buffer

这是Eden的一部分。每个线程都有一个TLAB,供其缓存数据。

这样可以减少多线程场景中,分配内存是需要加锁的开销。

 

4.1.2 Survivor

用来放 Minor GC后存活的对象。

两个Survivor区,一个 from,一个 to。GC过程中,Eden存活的对象和 from区的对象会被复制到 to区;to区就成了下一次GC的 from区,原 from区则成为 to区。

这样便于整理内存,防止内存碎片化。

 

4.2 老年代

一般存放从Survivor 区存活的对象

 

对象分配的一般逻辑

  • 普通对象一般分配在TLAB上;
  • 如果对象较大,会被分配到Eden的其它位置;
  • 如果对象太大,新生代放不下,就会被分配到老年代

多大的对象会被直接放入老年代?

GC方法不同,对大对象的判定方式也不同:
  • CMS(Concurrent Mark Sweep):可通过JVM启动参数 PretensureSizeThreshold 设置大对象的判定标准
  • G1:达到Region大小的一半即为大对象。可通过JVM启动参数 G1HeapRegionSize 设置Region的大小

 

5. 方法区

  • 存放元数据:类结构信息、运行时常量池、字段、方法代码等
  • 所有线程共享方法区
  • Oracle JDK 8 已移除原方法区(永久代),用元数据区(Metaspace)代替
    • Intern 字符串缓存 和 静态变量 都移到了堆中
    • 注:“方法区”是逻辑概念,“永久代”和“元数据区”是具体设计实现的选择

5.1 运行时常量池

  • 方法区的一部分
  • 存放编译期生成的字面量、运行时决定的符号引用

6. 直接内存区

  • 位于 JVM内存之外

7. 其它内存区

  • JIT Compiler 对热点方法的编译结果存放在 Code Cache 中
  • 垃圾收集器(GC)运行在本地线程中

8. 设置内存区容量

【常见方式】可通过以下JVM启动参数设置相关容量

 

 

  • 大小: 47.8 KB
分享到:
评论

相关推荐

    Java语言程序设计-进阶篇第8版2011

    本书可能会深入探讨JVM的架构、内存区域划分、垃圾回收机制(GC)等主题,并提供一些调优技巧。 ### Java标准库与工具 除了上述技术点外,本书还可能包括对Java标准库的介绍,比如日期时间API、正则表达式、Swing/...

    JAVA进阶资料 进阶资料

    3. **JVM内存区域划分.pdf**:Java虚拟机(JVM)是Java程序运行的平台,理解其内存模型至关重要。文件将详细介绍堆、栈、方法区、本地方法栈和程序计数器等区域,以及垃圾回收机制,有助于解决内存溢出和性能瓶颈...

    最全最详细的Java进阶核心知识集

    为了在Java领域进一步提升,了解和掌握Java进阶的核心知识至关重要。本文将深入探讨JVM(Java虚拟机),这是Java程序运行的基础,也是面试中经常考察的重点。 **JVM(Java虚拟机)** JVM是Java平台的核心组成部分...

    java-面试题合集,基础,进阶

    综上所述,Java面试中关于JVM的基础和进阶知识点涵盖了从JVM配置、类加载机制、内存管理到垃圾回收等多个方面。深入理解这些内容不仅有助于提高面试成功率,也能更好地应对实际开发中的性能调优等问题。

    云栖专家带你技术进阶之理解Java内存管理机制.pdf

    JVM负责在程序运行时管理内存分配与回收,它在运行Java程序时会划分几个不同的内存区域,如堆(Heap)、栈(Stack)、方法区(Method Area)和本地方法栈(Native Method Stacks)。堆是JVM所管理的内存中最大的一块...

    高级java工程师面试考纲,java高级工程师进阶知识地图

    1. **内存区域划分** - **JVM内存模型**:理解程序计数器、堆、虚拟机栈、本地方法栈、方法区(Java 8中被Metaspace取代)的作用。 - **堆内存**:掌握新生代(包含Eden区、Survivor1区、Survivor2区)和老年代的...

    JAVA核心知识点整理——java自学资料.rar

    9. **垃圾回收与内存管理**:理解JVM的工作原理,包括内存区域划分、垃圾回收机制、性能调优等,对于优化程序性能至关重要。 10. **泛型**:泛型的使用和限制,以及如何利用泛型提高代码的类型安全性和重用性。 11...

    2020年最新Java核心知识点整理.pdf

    标题为《2020年最新Java核心知识点整理》,描述为对Java基础到进阶的全部学习资料进行整理,这些内容旨在提供给Java学习者,帮助他们系统性地掌握Java编程。文件还特别提到了JVM(Java虚拟机)以及GC(垃圾回收)等...

    JVM面试整理

    JVM内存区域划分 **程序计数器(Program Counter Register)**:每个线程都有一个独立的程序计数器,它保存着当前线程正在执行的字节码的行号指示器。这个区域是唯一一个在Java虚拟机规范中没有规定任何内存溢出错误...

    java-learn-源码.rar

    学习源码还可以深入了解JVM的工作原理,如垃圾回收机制、内存区域划分等,有助于优化程序性能。 总之,"java-learn-源码.rar"提供了丰富的Java学习资源,涵盖了从基础到进阶的多个层面,对于希望深入理解Java编程...

    【Java面试资料】-校招Java面试题集(全)

    - **JVM相关**:了解JVM内存模型,理解堆、栈、方法区等区域的划分,以及垃圾回收机制。 - **并发编程**:讨论线程安全问题,如死锁、活锁、饥饿状态,以及如何避免这些问题。 - **Spring框架**:理解IoC和AOP...

    java面试突击资料

    - **内存区域划分**:堆、栈、方法区、程序计数器等。 - **垃圾回收算法**:标记-清除算法、复制算法、标记-整理算法等。 #### 三、Java高级篇 **3.1 泛型** - **泛型类和泛型方法**:使用定义泛型类型。 - **...

    java爱好者必备--JAVA解惑(中文版PDF)

    书中会涉及类加载机制、垃圾回收、内存区域划分等内容。 10. **异常处理**:Java的异常处理机制有助于捕获和处理程序运行时的错误,保证程序的健壮性。书中会介绍如何正确使用try-catch-finally语句块以及自定义...

    深入JVM内核—原理、诊断与优化 共11章ppt

    这包括类加载的双亲委派模型,以及JVM内存区域的划分,如堆、栈、方法区、本地方法栈等。 3. **常用JVM配置参数**:详细介绍了JVM启动时可以使用的各种参数,如-Xms、-Xmx用于设置堆内存大小,-XX:MaxPermSize设置...

    <<深入JAVA虚拟机中文第二版>>(带目录版)

    本书首先会介绍JVM的基本结构和工作原理,包括类加载机制、内存区域划分、字节码执行引擎等基础知识。接着,会深入探讨JVM的内存管理,特别是垃圾收集算法和内存调优策略,这对于理解和优化大型Java应用的性能至关...

    jvm高级特性第二版

    理解这些内存区域的划分和交互,对于避免内存溢出和性能瓶颈至关重要。 其次,书中深入剖析了类加载机制,包括类加载器的层次结构、双亲委托模型以及类加载的时机。了解这些内容有助于我们进行更精细的类管理,比如...

    The Java Language Specification (Third Edition)

    这包括对volatile变量的定义、线程同步(synchronized关键字)以及JVM内存区域的划分。 6. **Java虚拟机(JVM)**:虽然JLS主要关注语言层面,但JVM规范也是理解Java运行时环境的关键。JVM负责解释执行字节码、垃圾...

    2018面试经典题目总结

    - JVM的内存区域划分:堆内存、栈内存、方法区等。 - 内存溢出与内存泄漏的区别。 5. **垃圾回收机制**: - 垃圾回收算法(标记-清除、复制算法、分代收集等)。 - GC根节点可达性分析算法。 6. **性能优化**...

    java面试,Java基础知识

    - **内存区域**:JVM内存主要分为堆内存和非堆内存两大部分。堆内存用于存储对象实例和数组;非堆内存包括方法区、程序计数器、本地方法栈和虚拟机栈等。 - **垃圾回收算法**:常见的垃圾回收算法包括标记-清除算法...

    java外包笔试题两套.zip

    1. **JVM内存模型**:理解堆、栈、方法区、本地方法栈等区域的划分及其作用。 2. **垃圾回收机制**:包括垃圾收集器的工作原理,内存分配与回收策略。 3. **并发编程**:深入理解线程池,原子性操作(Atomic类),...

Global site tag (gtag.js) - Google Analytics