JVM内存结构分析整理

简介: JVM内存结构: 线程共享:堆,方法区 非线程共享: 虚拟机栈,本地方法栈,程序计数器 堆:所有的实例对象以及数组都要在堆上分配  ,从内存回收角度看: 细分为 新生代 和 老生代          是垃圾收集器管理的主要区域。 方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码   内存回收的主要目标:针对常量池的回收和对类型的卸载  

JVM内存结构:


线程共享:堆,方法区

非线程共享: 虚拟机栈,本地方法栈,程序计数器


堆:所有的实例对象以及数组都要在堆上分配  ,从内存回收角度看: 细分为 新生代 和 老生代          是垃圾收集器管理的主要区域。

方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器(JIT)编译后的代码  

内存回收的主要目标:针对常量池的回收和对类型的卸载                                                                              垃圾比较少回收这个区域。

String.intern()方法 注意(参考深入 理解java虚拟机)


虚拟机栈: 线程私有,生命周期与线程相同   为虚拟机执行java方法(字节码)服务

 描述的是java方法执行的内存模型 :

每个方法被执行时同时会创建一个栈帧 用于存储局部变量表 、操作栈、动态链接、方法出口信息。方法被调用到执行完 对应着栈帧在虚拟机栈中从入栈到出栈的过程


本地方法栈:为虚拟机使用到的Native方法服务


程序计数器:线程私有   当前线程所执行的字节码的行号指示器。记录正在执行的虚拟机字节码指令的地址。


JVM垃圾回收机制:

GC的基本原理:找到程序中不再被使用的对象,然后回收这些对象所占用的内存空间。
GC判断对象不再使用的算法:
对象存活判断算法:引用计数算法和根搜索算法
基本的垃圾回收算法:标记-清除、复制、标记-整理,分代收集算法
依赖线程实现的回收算法:串行、并行、并发

 其中对象存活判定算法是其他算法的基石,用来判断对象是否存活,能否回收;基本的垃圾回收算法是垃圾垃圾收集器实现的基础算法;而依赖线程实现的算法,则是基本算法在考虑线程环境下的运用,这个有多线程基础的看名字就明白了。此外,还有综合以上算法并从特定角度实现的算法,如分代回收(针对分区)、增量回收(针对实时性)


内存分配和回收策略

1.对象优先在新生代 Eden上分配

2.大对象直接进入老年代

3.长期存活的对象将进入老年代(动态对象年龄判定

相关文章
|
Arthas 存储 算法
深入理解JVM,包含字节码文件,内存结构,垃圾回收,类的声明周期,类加载器
JVM全称是Java Virtual Machine-Java虚拟机JVM作用:本质上是一个运行在计算机上的程序,职责是运行Java字节码文件,编译为机器码交由计算机运行类的生命周期概述:类的生命周期描述了一个类加载,使用,卸载的整个过类的生命周期阶段:类的声明周期主要分为五个阶段:加载->连接->初始化->使用->卸载,其中连接中分为三个小阶段验证->准备->解析类加载器的定义:JVM提供类加载器给Java程序去获取类和接口字节码数据类加载器的作用:类加载器接受字节码文件。
1112 55
|
存储 弹性计算 缓存
阿里云服务器ECS经济型、通用算力、计算型、通用和内存型选购指南及使用场景分析
本文详细解析阿里云ECS服务器的经济型、通用算力型、计算型、通用型和内存型实例的区别及适用场景,涵盖性能特点、配置比例与实际应用,助你根据业务需求精准选型,提升资源利用率并降低成本。
839 3
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
1113 6
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
3355 4
|
10月前
|
存储 缓存 Java
我们来说一说 JVM 的内存模型
我是小假 期待与你的下一次相遇 ~
636 5
|
10月前
|
存储 缓存 算法
深入理解JVM《JVM内存区域详解 - 世界的基石》
Java代码从编译到执行需经javac编译为.class字节码,再由JVM加载运行。JVM内存分为线程私有(程序计数器、虚拟机栈、本地方法栈)和线程共享(堆、方法区)区域,其中堆是GC主战场,方法区在JDK 8+演变为使用本地内存的元空间,直接内存则用于提升NIO性能,但可能引发OOM。
|
10月前
|
设计模式 缓存 Java
【JUC】(4)从JMM内存模型的角度来分析CAS并发性问题
本篇文章将从JMM内存模型的角度来分析CAS并发性问题; 内容包含:介绍JMM、CAS、balking犹豫模式、二次检查锁、指令重排问题
265 1
|
存储 人工智能 自然语言处理
AI代理内存消耗过大?9种优化策略对比分析
在AI代理系统中,多代理协作虽能提升整体准确性,但真正决定性能的关键因素之一是**内存管理**。随着对话深度和长度的增加,内存消耗呈指数级增长,主要源于历史上下文、工具调用记录、数据库查询结果等组件的持续积累。本文深入探讨了从基础到高级的九种内存优化技术,涵盖顺序存储、滑动窗口、摘要型内存、基于检索的系统、内存增强变换器、分层优化、图形化记忆网络、压缩整合策略以及类操作系统内存管理。通过统一框架下的代码实现与性能评估,分析了每种技术的适用场景与局限性,为构建高效、可扩展的AI代理系统提供了系统性的优化路径和技术参考。
976 4
AI代理内存消耗过大?9种优化策略对比分析
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
844 29
JVM简介—1.Java内存区域
|
存储 Java 编译器
深入理解Java虚拟机--类文件结构
本内容介绍了Java虚拟机与Class文件的关系及其内部结构。Class文件是一种与语言无关的二进制格式,包含JVM指令集、符号表等信息。无论使用何种语言,只要能生成符合规范的Class文件,即可在JVM上运行。文章详细解析了Class文件的组成,包括魔数、版本号、常量池、访问标志、类索引、字段表、方法表和属性表等,并说明其在Java编译与运行过程中的作用。
382 0