JVM内存区域解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: “原创精选,转载注明出处,三克油”@Date 2017.05.24概念介绍(基于JDK7)堆(分代收集算法)年轻代(Minor GC)Eden区存储新对象或者生命周期很短的对象From Survivor区Eden...

“原创精选,转载注明出处,三克油”
@Date 2017.05.24

概念介绍(基于JDK7)

  • 堆(分代收集算法)

    1. 年轻代(Minor GC)
      • Eden区
        • 存储新对象或者生命周期很短的对象
      • From Survivor区
        • Eden区的垃圾回收仍能存活下来的依旧存在引用的对象会待在这个区域
      • To Survivor区
        • Eden区的垃圾回收仍能存活下来的依旧存在引用的对象会待在这个区域
    2. 年老代
      • Eden区和Survivor区的多次GC后仍然存活下来的对象 - major GC
      • 内存大小为-Xmx对应的值减去-Xmn对应的值
      • 新建的对象也有可能直接进入老年代
        1. 大对象:可通过启动参数设置-XX:PretenureSizeThreshold超过则直接在老年代分配
        2. 大的数组对象,且数组中无引用外部对象
  • 方法区(Non-Heap(非堆))

    1. 永久代(HotSpot VM)
      • 各个线程共享的内存区域
      • 方法区是线程安全的
      • 存储已被虚拟机加载的类信息、方法(数据及代码)、常量、静态变量、即时编译器编译后的代码等数据
      • 在Java8里已被废除了,被元空间取代
    2. 运行时常量池(Runtime Constant Pool)
      • 存放编译期生成的各种字面量和符号引用
      • 运行期间也可能将新的常量放入池中
      • String类的intern()方法
    1. 虚拟机栈
      • 方法执行的内存模型
      • 每个线程都有自己专属的栈,这个栈是别的线程无法访问的
      • 生命周期与线程相同
      • 存储局部变量表(存放方法参数和方法内部定义的局部变量)、操作栈、动态链接、方法出口、方法调用的中间结果及返回地址
      • 线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常
      • 虚拟机栈可动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常
    2. 本地方法栈
      • 为虚拟机使用到的Native方法服务
  • 计数器

    1. 程序计数器
      • 分支、循环、跳转、异常处理、线程恢复
      • 每条线程都需要有一个独立的程序计数器
      • JVM执行的字节码指令地址
      • 当前线程所执行的字节码的行号指示器
      • 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令
      • 此内存区域是唯一一个在Java 虚拟机规范中没有规定任何OutOfMemoryError情况的区域
  • 直接内存(Direct Memory)

    1. NIO出现后使用
      • 本机直接内存的分配不会受到Java堆大小的限制

持久代 --> 元空间 (JDK8)

  • 元空间
    1. 本地堆内存中的一部分
    2. 达到最大阈值时进行该区域清理
    3. 类及相关的元数据的生命周期与类加载器的一致
    4. 使用-XX:MaxMetaspaceSize参数可以设置元空间的最大值
    5. 默认是没有上限的,系统内存上限是多少它就是多少
    6. 达到设定的最大值后,对于无用的类和类加载器,垃圾收集此时会触发

Error

  • 内存溢出(Out Of Memory) : 程序在申请内存时,没有足够的内存空间供其使用
  • 内存泄露(Memory Leak) : 程序在申请内存后,无法释放已申请的内存空间.一次内存泄露可以忽略,泄露堆积后果很严重,最终会导致Out Of Memory.
相关文章
|
27天前
|
存储 缓存 安全
Java内存模型深度解析:从理论到实践####
【10月更文挑战第21天】 本文深入探讨了Java内存模型(JMM)的核心概念与底层机制,通过剖析其设计原理、内存可见性问题及其解决方案,结合具体代码示例,帮助读者构建对JMM的全面理解。不同于传统的摘要概述,我们将直接以故事化手法引入,让读者在轻松的情境中领略JMM的精髓。 ####
33 6
|
10天前
|
存储 Java 开发者
浅析JVM方法解析、创建和链接
上一篇文章《你知道Java类是如何被加载的吗?》分析了HotSpot是如何加载Java类的,本文再来分析下Hotspot又是如何解析、创建和链接类方法的。
|
18天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
20天前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
20天前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####
|
24天前
|
Java 编译器 API
深入解析:JDK与JVM的区别及联系
在Java开发和运行环境中,JDK(Java Development Kit)和JVM(Java Virtual Machine)是两个核心概念,它们在Java程序的开发、编译和运行过程中扮演着不同的角色。本文将深入解析JDK与JVM的区别及其内在联系,为Java开发者提供清晰的技术干货。
24 1
|
26天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
231 1
|
2月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
43 4
|
28天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
21 3

推荐镜像

更多