jvm内存解析

 转载原文出处:http://www.codeceo.com/article/jvm-memory-stack.html

 

JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢了,当然原因肯定不止这一个,如在JVM中没有数据寄存器,指令集使用的是栈来保存中间数据…等,尽管Java的贡献者们为执行速度的提高想了各种办法,如JIT、动态编译器等,以下是Leetcode中一道题目用不同的语言实现时的执行性能对比图…

以下是JVM的一个基本架构图,在这个基本架构图中,栈有两部份,Java线程栈以及本地方法栈,栈的概念与C/C++程序基本上都是一个概念,里面存放的都是栈帧,一个栈帧代表的就是一个函数的调用,在栈帧里面存放了函数的形参,函数的局部变量, 返回地址等,但是与C/C++的一个重要区别是,C/C++里面有传值以及传址的区别,当传的是一个对象时( 结构体也可以当成对象,其实就是对象~,只不过里面的方法默认都是public的,不信你可以试试,在结构体中加一个函数,编译器也不会报错,程序依旧运行~~~),会将对象复到到栈中,而Java中只有基本类型才是传值的,其他类型传的都是引用,什么是引用,学过C/C++的就把引用当作指针理解吧~~~,在这个基本架构图中,可以看出JVM还定义了一个本地方法栈,本地方法栈是为Java调用本地方法【这些本地方法是由其他语言编写的】服务的

上面的图中看到的是JVM中栈有两个,但是堆只有一个,每一个线程都有自已的线程栈【线程栈的大小可以通过设置JVM的-xss参数进行配置,32位系统下,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K】,线程栈里面的数据属于该线程私有,但是所有的线程都共享一个堆空间,堆中存放的是对象数据,什么是对象数据,排除法,排除基本类型以及引用类型以外的数据都将放在堆空间中。其中方法区和堆是所有线程共享的数据区。

1.程序计数器

  在CPU的寄存器中有一个PC寄存器,存放下一条指令地址,这里,虚拟机不使用CPU的程序计数器,自己在内存中设立一片区域来模拟CPU的程序计数器。只有一个程序计数器是不够的,当多个线程切换执行时,那就单个程序计数器就没办法了,虚拟机规范中指出,每一条线程都有一个独立的程序计数器。注意,Java虚拟机中的程序计数器指向正在执行的字节码地址,而不是下一条。

2. Java虚拟机栈 

  Java虚拟机栈也是线程私有的,虚拟机栈描述的是Java方法执行的内存模型:每个方法执行的时候都会创建一个栈帧,用于存放局部变量表,操作数栈,动态链接,方法出口等信息。每一个方法从调用直到执行完成的过程都对应着一个栈帧在虚拟机中的入栈到出栈的过程。我们平时把内存分为堆内存和栈内存,其中的栈内存就指的是虚拟机栈的局部变量表部分。局部变量表存放了编译期可以知道的基本数据类型(boolean、byte、char、short、int、float、long、double),对象引用(可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或者其他与此对象相关的位置),和返回后所指向的字节码的地址。其中64 位长度的long 和double 类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。当递归层次太深时,会引发java.lang.StackOverflowError,这是虚拟机栈抛出的异常。

 3. 本地方法栈 

  在HotSpot虚拟机将本地方法栈和虚拟机栈合二为一,它们的区别在于,虚拟机栈为执行Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。

4. Java堆

  Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个区域是用来存放对象实例的,几乎所有对象实例都会在这里分配内存。堆是Java垃圾收集器管理的主要区域(GC堆),垃圾收集器实现了对象的自动销毁。Java堆可以细分为:新生代和老年代;再细致一点的有Eden空间,From Survivor空间,To Survivor空间等。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。可以通过-Xmx和-Xms控制

5. 方法区 

  方法区也叫永久代。在过去(自定义类加载器还不是很常见的时候),类大多是”static”的,很少被卸载或收集,因此被称为“永久的(Permanent)”。虽然Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆),目的应该是与Java 堆区分开来。同时,由于类class是JVM实现的一部分,并不是由应用创建的,所以又被认为是“非堆(non-heap)”内存。HotSpot 虚拟机的设计团队选择把GC 分代收集扩展至方法区,或者说使用永久代来实现方法区而已。对于其他虚拟机(如BEA JRockit、IBM J9 等)来说是不存在永久代的概念的。

  永久代也是各个线程共享的区域,它用于存储已经被虚拟机加载过的类信息,常量,静态变量(JDK7中被移到Java堆),即时编译期编译后的代码(类方法)等数据。这里要讲一下运行时常量池,它是方法区的一部分,用于存放编译期生成的各种字面量和符号引用(其实就是八大基本类型的包装类型和String类型数据(JDK7中被移到Java堆))(官方文档说明: In JDK 7, interned strings are no longer allocated in the permanent generation of the Java heap, but are instead allocated in the main part of the Java heap (known as the young and old generations), along with the other objects created by the application)。

  在JDK1.7中的HotASpot中,已经把原本放在方法区的字符串常量池移出。

  • 将interned String移到Java堆中
  • 将符号Symbols移到native memory(不受GC管理的内存)

  从JDK7开始永久代的移除工作,贮存在永久代的一部分数据已经转移到了Java Heap或者是Native Heap。但永久代仍然存在于JDK7,并没有完全的移除:符号引用(Symbols)转移到了native heap;字面量(interned strings)转移到了java heap;类的静态变量(class statics)转移到了java heap。随着JDK8的到来,JVM不再有PermGen。但类的元数据信息(metadata)还在,只不过不再是存储在连续的堆空间上,而是移动到叫做“Metaspace”的本地内存(Native memory)中。

在JVM中共享数据空间划分如下图所示

上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条

1.JVM中共享数据空间可以分成三个大区,新生代(Young Generation)、老年代(Old Generation)、永久代(Permanent Generation),其中JVM堆分为新生代和老年代

2.新生代可以划分为三个区,Eden区(存放新生对象),两个幸存区(From Survivor和To Survivor)(存放每次垃圾回收后存活的对象)

3.永久代管理class文件、静态对象、属性等(JVM uses a separate region of memory, called the Permanent Generation (orPermGen for short), to hold internal representations of java classes. PermGen is also used to store more information )

4.JVM垃圾回收机制采用“分代收集”:新生代采用复制算法,老年代采用标记清理算法。

作为操作系统进程,Java 运行时面临着与其他进程完全相同的内存限制:操作系统架构提供的可寻址地址空间和用户空间。

操 作系统架构提供的可寻址地址空间,由处理器的位数决定,32 位提供了 2^32 的可寻址范围,也就是 4,294,967,296 位,或者说 4GB。而 64 位处理器的可寻址范围明显增大:2^64,也就是 18,446,744,073,709,551,616,或者说 16 exabyte(百亿亿字节)。

地址空间被划分为用户空间和内核空间。内核是主要的操作系统程序和C运行时,包含用于连接计算机硬件、调度程序以及提供联网和虚拟内存等服务的逻辑和基于C的进程(JVM)。除去内核空间就是用户空间,用户空间才是 Java 进程实际运行时使用的内存。

默认情况下,32 位 Windows 拥有 2GB 用户空间和 2GB 内核空间。在一些 Windows 版本上,通过向启动配置添加 /3GB 开关并使用 /LARGEADDRESSAWARE 开关重新链接应用程序,可以将这种平衡调整为 3GB 用户空间和 1GB 内核空间。在 32 位 Linux 上,默认设置为 3GB 用户空间和 1GB 内核空间。一些 Linux 分发版提供了一个hugemem内核,支持 4GB 用户空间。为了实现这种配置,将进行系统调用时使用的地址空间分配给内核。通过这种方式增加用户空间会减慢系统调用,因为每次进行系统调用时,操作系统必须在地址空间之间复制数据并重置进程地址-空间映射。

下图为一个32 位 Java 进程的内存布局:

 

可寻址的地址空间总共有 4GB,OS 和 C 运行时大约占用了其中的 1GB,Java 堆占用了将近 2GB,本机堆占用了其他部分。请注意,JVM 本身也要占用内存,就像 OS 内核和 C 运行时一样。

注意:

1. 上文提到的可寻址空间即指最大地址空间。

2. 对于2GB的用户空间,理论上Java堆内存最大为1.75G,但一旦Java线程的堆达到1.75G,那么就会出现本地堆的Out-Of-Memory错误,所以实际上Java堆的最大可使用内存为1.5G。

在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例

1.Java heap的大小(新生代+老年代)

  -Xms堆的最小值

  -Xmx堆空间的最大值

2.新生代堆空间大小调整

  -XX:NewSize新生代的最小值

  -XX:MaxNewSize新生代的最大值

  -XX:NewRatio设置新生代与老年代在堆空间的大小

  -XX:SurvivorRatio新生代中Eden所占区域的大小

3.永久代大小调整

  -XX:MaxPermSize

4.其他

   -XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收

在上面的配置中,老年代所占空间的大小是由-XX:SurvivorRatio这个参数进行配置的,看完了上面的JVM堆空间分配图,可能会奇怪,为啥新生代空间要划分为三个区Eden及两个Survivor区?有何用意?为什么要这么分?要理解这个问题,就得理解一下JVM的垃圾收集机制(复制算法也叫copy算法),步骤如下:

复制(Copying)算法

将内存平均分成A、B两块,算法过程:

1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象对象复制到B块。
2. 清理A块所有对象。
3. 新生对象被分配的B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象对象复制到A块。
4. 清理B块所有对象。
5. goto 1。

优点:简单高效。缺点:内存代价高,有效内存为占用内存的一半。

图解说明如下所示:(图中后观是一个循环过程)

对复制算法进一步优化:使用Eden/S0/S1三个分区

平均分成A/B块太浪费内存,采用Eden/S0/S1三个区更合理,空间比例为Eden:S0:S1==8:1:1,有效内存(即可分配新生对象的内存)是总内存的9/10。

算法过程:

1. Eden+S0可分配新生对象;
2. 对Eden+S0进行垃圾收集,存活对象复制到S1。清理Eden+S0。一次新生代GC结束。
3. Eden+S1可分配新生对象;
4. 对Eden+S1进行垃圾收集,存活对象复制到S0。清理Eden+S1。二次新生代GC结束。
5. goto 1。

默认Eden:S0:S1=8:1:1,因此,新生代中可以使用的内存空间大小占用新生代的9/10,那么有人就会问,为什么不直接分成两个区,一个区占9/10,另一个区占1/10,这样做的原因大概有以下几种

1.S0与S1的区间明显较小,有效新生代空间为Eden+S0/S1,因此有效空间就大,增加了内存使用率
2.有利于对象代的计算,当一个对象在S0/S1中达到设置的XX:MaxTenuringThreshold值后,会将其分到老年代中,设想一下,如果没有S0/S1,直接分成两个区,该如何计算对象经过了多少次GC还没被释放,你可能会说,在对象里加一个计数器记录经过的GC次数,或者存在一张映射表记录对象和GC次数的关系,是的,可以,但是这样的话,会扫描整个新生代中的对象, 有了S0/S1我们就可以只扫描S0/S1区了~~~

 

参考资料:http://my.oschina.net/hosee/blog/638753

转载于:https://my.oschina.net/u/3618851/blog/1588459

JVM 内存布局深度解析,你所不知道的一面 首先,我们需要定义一个本地方法。这通常在C或C++中完成,并使用JNIEXPORT和Java_// 本地方法实现\n");通过本文,我们深入探究了 JVM 内存布局的方方面面。从最重要的堆内存,到方法区的元数据信息,再到虚拟机栈和本地方法栈中的线程私有区域,相信你现在对 JVM 的内存分配和管理有了全新的认识。不过,JVM内存管理远不止这些。比如上文中提到的垃圾收集器,它是如何判断对象是否需要回收?各种垃圾收集算法的优缺点是什么?分代收集器工作原理又是怎样的? 阅读详情

相关推荐

深入解析JVM内存区域划分:从理论到实践

Java虚拟机(JVM)是Java程序运行的核心环境,它负责管理内存分配、垃圾回收、字节码执行等关键任务。理解JVM的内存区域划分,对于优化Java应用性能、排查内存问题(如OutOfMemoryError、StackOverflowError)至关重要。本文将详细解析JVM的内存结构,涵盖各个区域的作用、特点、异常情况,并结合实际案例进行分析。

vvilkin的学习备忘 1247

JVM内存堆布局图解分析

转载原文出处:http://www.codeceo.com/article/jvm-memory-stack.html JAVA能够实现跨平台的一个根本原因,是定义了class文件的格式标准,凡是实现该标准的JVM都能够加载并解释该class文件,据此也可以知道,为啥Java语言的执行速度比C/C++语言执行的速度要慢了,当然原因肯定不止这一个,如在JVM中没有数据寄存器,指令...

dielishang0645的博客 292

JVM内存调优深度解析:从理论到实践

JVM内存调优的本质是平衡吞吐量、延迟和内存占用三者关系。调优效果 = 数据驱动分析 × 合理参数调整 × 代码优化准确识别各内存区域的问题熟练使用JDK工具链进行诊断制定针对性的优化方案建立完整的调优方法论最后忠告:没有银弹参数,只有最适合业务的配置!

正在努力模索的博客 745

一文搞懂C++内存布局:堆、栈及内存分区的完整指南

在C++编程中,内存的管理和分配是程序性能和稳定性的重要组成部分。本文详细介绍了程序运行时的常见内存分区,包括栈区、堆区、代码区、全局数据区(已初始化与未初始化数据)以及常量区。通过清晰的代码示例,解释了栈区用于存储局部变量、函数参数和返回地址,堆区则用于动态分配内存,特别适合存储生命周期不确定的对象。文章还介绍了操作系统管理的内存区域,如动态链接库内存和内核空间。通过本文,读者可以全面了解C++中的内存布局及其在程序运行中的作用,掌握如何合理使用不同的内存分区,从而优化程序性能和内存

weixin_52985599的博客 1596

EGO-Planner文章解读(一)——论文原理和算法实现

详细解读egoplanner论文和代码

fegxg的博客 3990

串级PID 位置环+速度环

串级PID 位置环+速度环

weixin_62775618的博客 9109

Java问题诊断和排查工具(查看JVM参数、内存使用情况及分析等)

显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。推荐用JVisualVM。

syq8023的博客 7104

ESP32+ST7789 LCD屏实战:5分钟搞定中文显示与图片渲染(附完整代码)

本文提供了一份详细的ESP32驱动ST7789 LCD屏幕的实战指南。通过清晰的SPI硬件连接说明、ESP-IDF框架下的初始化代码,以及图片渲染与中文字库构建的核心算法,帮助开发者快速实现中文显示与图片渲染功能,并附有完整的代码示例和性能优化技巧。

weixin_29189377的博客 438

JVM内存解析 笔记联想

方法中声明静态变量? JVM内存解析 笔记联想 编译器编译源文件(包含类库jar文件)为字节码即class文件。将包含main方法的类文件提供给字节码解释器,JVM类加载器依据程序中出现顺序加载类。加载完成交由程序执行引擎执行程序。运行时数据区即JVM内存存储程序执行所需数据。 JVM内存规范 JVM内存分为几部分 程序计数器、Java栈、本地方法栈、堆、方法区程序计数器存储程序中下一条指令

dolearnwhile1的博客 285

手把手教你用Qt和QScada框架,从零搭建一个简易的工业组态监控界面

本文详细介绍了如何使用Qt和QScada框架从零搭建工业组态监控界面,涵盖环境配置、界面设计、动态数据绑定及高级功能实现。通过实战案例演示,帮助开发者快速掌握SCADA系统开发技巧,提升工业自动化项目的开发效率。

weixin_32932149的博客 340

图信号处理中的多尺度分析:图小波变换与图傅里叶变换的对比与应用

本文深入探讨了图信号处理中的多尺度分析方法,重点对比了图小波变换(GWT)与图傅里叶变换(GFT)的技术特点与应用场景。通过分析图的拓扑结构,GWT展现出强大的局部洞察力,适用于异常检测和社区发现;而GFT则擅长全局频率分析,适合趋势分析和信号去噪。文章结合实战案例,为读者提供了方法选型指南和前沿进展,帮助开发者在生物信息学、社交网络分析等领域高效应用这些技术。

weixin_30369041的博客 406

java 内存调优_JVM性能调优的6大步骤,及关键调优参数详解

本系列会持续更新。一、JVM内存调优对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数。1.Full GC会对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比较慢,因此应该尽可能减少Full GC的次数。2.导致Full GC的原因1)年老代(Tenured)被写满调优时尽量让对象在新生代GC时被回收、让对象在新生代多...

weixin_39539684的博客 531

一文搞懂自适应激光控制技术,开启光学新时代

自适应激光控制技术作为现代光学领域的关键技术,以其独特的原理和高效的工作机制,在科研、工业等众多领域展现出了巨大的应用价值。通过对激光波前的实时测量与补偿,它成功克服了激光在传输和应用过程中面临的诸多挑战,显著提升了激光的光束质量和应用效果。在科研领域,它助力天文观测突破大气湍流的限制,让我们得以更清晰地窥探宇宙的奥秘;在激光核聚变研究中,为实现高效的核聚变反应提供了关键支持,为解决能源问题带来了新的希望。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2529

JVM 内存结构深度解析

JVM内存结构是Java性能优化的核心基础。理解各个内存区域的特性和相互关系,掌握内存分配、回收机制,能够有效解决内存溢出、GC频繁等问题。通过合理的监控和调优,可以显著提升应用性能和稳定性。​​关键要点​堆内存是对象存储的主要区域,需要合理配置大小方法区(元空间)存储类元信息,避免动态类滥用虚拟机栈需要注意栈深度和线程数控制合理选择垃圾收集器和参数配置使用工具监控和分析内存使用情况。

fengruxue的专栏 1036

YOLOv11改进 | 检测头篇 | 利用动态蛇形卷积DySnakeConv改进yolov11分割检测头(全网独家首发,Segment)

本文给大家带来的最新改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过动态形状的卷积核来增强感知能力,针对管状结构的特征提取进行优化,所以将这个卷积针对于YOLOv11的分割头进行融合是非常合适的,当然本文的检测头也支持用于目标检测,但是我将其设计出来是主要为了分割的读者使用的。

Snu77的博客 3430

让 ABAP 开发更聪明的搭档:SAP Joule for Developers 与 ABAP AI Capabilities 全面实战

摘要:SAP已将生成式AI集成到ABAP开发工具中,推出Joule for Developers功能。该功能直接嵌入Eclipse开发环境,提供代码解释、生成、测试构造和遗留代码迁移等辅助功能。Joule支持ABAP Cloud项目开发,能围绕当前开发对象提供上下文相关的建议,帮助开发者高效完成应用开发与迁移任务。启用该功能需升级ADT并获取相应许可,典型应用场景包括RAP应用构建和S/4HANA迁移中的代码重构。官方资源提供了多个实践案例,帮助开发者快速上手这一AI辅助开发功能。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 492

JVM 系列:JVM 内存结构深度解析

海量数据存储和性能优化。通用框架/组件设计与封装。如何设计合适的技术架构?如何成功转型架构设计与技术管理?在竞争激烈的大环境下,只有不断提升核心竞争力才能立于不败之地。留言【我要晋级】,一对一指导,带你晋级。

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 1563

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JVM 内存结构解析

文章首发于陈建源的博客,欢迎访问。 文章作者:陈建源 文章链接:https://www.techstack.tech/post/jvm-nei-cun-jie-gou/ 我们在开发 Java 程序的过程基本不用关心 Java 运行时的内存管理,是因为 Java 程序在运行时内存都由虚拟机来进行管理。Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,我们称之为运行时数据区域。 运行时数据区域 根据《Java虚拟机规范(Java SE 7版)》的规定,Java虚拟机.

41uLove 292

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java JVM 内存解析

文章目录Java JVM 内存解析1、最大可用内存 -Xmx2、虚拟机中可用内存量3、虚拟机总内存量4、虚拟机当前实际可用内存5、Log 方法 Java JVM 内存解析 1、最大可用内存 -Xmx 设置虚拟机最大可以使用的内存总量 // JDK 源码 /** * Returns the maximum amount of memory that the...

简简单单Onlinezuozuo 4423

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JVM内存结构解析

JVM的整体结构 这是Oracle官方对jvm内存的定义:docs.oracle.com/javase/spec… 内存的分布结构 虚拟机栈:每个线程独有的,虚拟机会为每个线程都开辟一块栈空间用来存放当前线程的每个方法在执行过程中的局部变量,当然,这里不仅仅只有局部变量,还有 操作数栈、动态连接、方法出口; 本地方法栈:和虚拟机栈类似,但是他是存放的native方法在执行过程中的局部变量,这部分很少用,不用去关注; 程序计数器:用来记录每个线程在进行上下文切换的时候,记录上次执行的符号引用,也是每个线程独有

qq_39745959的博客 151

JVM内存解析

JVM内存解析JVM概念为什么要学习JVMJVM原理JVM执行程序的过程JVM的生命周期JVM内存模型运行时数据区存储了哪些数据?JVM内存溢出的情况 JVM概念 1.JVM(Java Virtual Machine) 1)是Java平台的一部分,是一种能够运行Java bytecode的虚拟机 2)是硬件计算机的抽象(虚拟)实现,可以解释执行Java字节码 3)是实现Java跨平台运行的基石 2.jdk、jre、jvm是什么关系? (1)JRE(Java Runtime Environment),也就是j

qq_43402545的博客 521

深入解析Java JVM内存结构

本文详细解析了Java JVM内存结构,重点区分了内存模型与内存区域的核心概念。主要内容包括: JVM运行流程:从.java文件编译到类加载(双亲委派机制),再到内存分配过程 内存模型组成:线程私有的程序计数器、虚拟机栈、本地方法栈,以及共享的堆和方法区 关键区别: 方法区是逻辑概念,永久代/元空间是其实现 虚拟机栈存储Java方法栈帧,本地方法栈服务native方法 重要修正:澄清JDK 1.7后常量池存放位置的变化(永久代→堆) 其他组件:JNI接口、JIT编译器、垃圾收集器的作用 文章特别强调要避免网

小电玩 1671

JVM内存模型解析

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 1702

在线解析JVM内存溢出 dump文件

在线解析JVM内存溢出 dump文件

weixin_39183923的博客 1325

深入解析JVM内存模型

运行时数据区,也被称为JMM,全称 Java Memory Model(Java内存模型 )JVM内存模型定义了Java程序运行时数据的存储和管理方式,分为线程共享区域和线程私有区域。

2301_78423465的博客 390

JVM内存模型详细解析

JVM内存模型详情解析 一、结构图 NOTE: string常量池 存在 堆内存中 二、各部分详情解析 1、堆 1)老年代 对象年龄(经过一次 monitor GC 年龄加1) >15 的会存到 老年代 2)年轻代 eden 内存分配默认是 年轻代 80% survivor 内存分配默认是 年轻代20%(from 和 to 区分别占10%) 3)常量池: ​ String常量 存储在堆中 2、虚拟机栈 1)局部变量表 存储的数据:存放方法参数和方法内定义的局部变量 note:局部

beauty-coding 的博客 4089
上一篇: 主键生成策略
下一篇: ioc源码记录
cheqiang4607
博客等级 码龄10年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值