帮助你深入理解JVM虚拟机,什么是Java内存模型结构的方法区

Java 虚拟机(JVM)方法区详解 Java 虚拟机(JVM)是 Java 程序运行的核心,而方法区(Method Area)是 JVM 内存模型中一个非常重要的组成部分。本文将深入探讨方法区的作用、存储内容、实现方式以及相关的调优和异常处理。 阅读详情

深入理解JVM虚拟机——Java内存模型结构之搞懂方法区

方法区(Method Area) 与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区分开来。

本文将从栈、堆、方法区的交互关系、方法区的理解、设置方法区大小与 OOM、方法区的内部结构、方法区使用举例、方法区的演进细节、方法区垃圾回收等解析

栈、堆、方法区的交互关系

​

栈、堆、方法区的交互关系

代码演示

public class AppMain { //运行时,JVM把AppMain的信息都放入方法区 public static void main(String[] args) { //main成员方法本身放入方法区。 Sample test1 = new Sample( " 测试1 " ); //test1是引用,所以放到栈区里,Sample是自定义对象应该放到堆里面 Sample test2 = new Sample( " 测试2 " ); test1.printName(); test2.printName(); } }

// Sample.java public class Sample { //运行时,JVM把appmain的信息都放入方法区。 private name; //new Sample实例后,name引用放入栈区里,name对象放入堆里。 public Sample(String name) { this .name = name; } public void printName() {// printName()成员方法本身放入方法区里。 System.out.println(name); } }

JVM执行具体流程

  1. 系统收到了我们发出的指令,启动了一个Java虚拟机进程,这个进程首先从classpath中找到AppMain.class文件,读取这个文件中的二进制数据,然后把Appmain类的类信息存放到运行时数据区的方法区中。这一过程称为AppMain类的加载过程。

  2. 接着,JVM定位到方法区中AppMain类的Main()方法的字节码,开始执行它的指令。

  3. 这个main()方法的第一条语句就是: Sample test1 = new Sample(“测试1”);语句很简单,就是让JVM创建一个Sample实例,并且呢,使引用变量test1引用这个实例 貌似小case一桩哦,就让我们来跟踪一下JVM,看看它究竟是怎么来执行这个任务的:

1)、Java虚拟机一看,不就是建立一个Sample类的实例吗,简单,于是就直奔方法区(方法区存放已经加载的类的相关信息,如类、静态变量和常量)而去,先找到Sample类的类型信息再说。结果呢,嘿嘿,没找到@@,这会儿的方法区里还没有Sample类呢(即Sample类的类信息还没有进入方法区中)。可JVM也不是一根筋的笨蛋,于是,它发扬“自己动手,丰衣足食”的作风,立马加载了Sample类, 把Sample类的相关信息存放在了方法区中。

2)、Sample类的相关信息加载完成后。Java虚拟机做的第一件事情就是在堆中为一个新的Sample类的实例分配内存,这个Sample类的实例持有着指向方法区的Sample类的类型信息的引用(Java中引用就是内存地址)。这里所说的引用,实际上指的是Sample类的类型信息在方法区中的内存地址,其实,就是有点类似于C语言里的指针啦~~,而这个地址呢,就存放了在Sample类的实例的数据区中。

3)、在JVM中的一个进程中,每个线程都会拥有一个方法调用栈,用来跟踪线程运行中一系列的方法调用过程,栈中的每一个元素被称为栈帧,每当线程调用一个方法的时候就会向方法栈中压入一个新栈帧。这里的帧用来存储方法的参数、局部变量和运算过程中的临时数据。OK,原理讲完了,就让我们来继续我们的跟踪行动!位于“=”前的test1是一个在main()方法中定义的变量,可见,它是一个局部变量,因此,test1这个局部变量会被JVM添加到执行main()方法的主线程的Java方法调用栈中。而“=”将把这个test1变量指向堆区中的Sample实例,也就是说,test1这个局部变量持有指向Sample类的实例的引用(即内存地址)。

4)、JVM将继续执行后续指令,在堆区里继续创建另一个Sample类的实例,然后依次执行它们的printName()方法。当JVM执行test1.printName()方法时,JVM根据局部变量test1持有的引用,定位到堆中的Sample类的实例,再根据Sample类的实例持有的引用,定位到方法区中Sample类的类型信息(包括①类,②静态变量,③静态方法,④常量和⑤成员方法),从而获取printName()成员方法的字节码,接着执行printName()成员方法包含的指令。

方法区的理解

在《Java虚拟机规范》中明确说明,“尽管所有的方法区在逻辑上属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩”。但对于 HotSpot 虚拟机而言,方法区还有一个别名叫做 Non-Heap(非堆),目的就是要和堆分开。

所以,方法区可以看做是一块独立于 Java 堆的内存空间。

​运行时数据区

方法区主要存放的是 Class ,而堆中主要存放的是实例化的对象

  • 方法区(Method Area) 与 Java堆 一样,是各个线程共享的内存区域。

  • 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。

  • 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。

  • 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误: Java.lang.OutofMemoryError:PermGen space 或者 java.lang.OutOfMemoryError:Metaspace 加载大量的第三方的 jar 包,Tomcat部署的工程过多(30~50个),大量动态的生成反射类

  • 关闭JVM就会释放这个区域的内存。

设置方法区大小与 OOM 方法区的大小不必是固定的,JVM可以根据应用的需要动态调整。

jdk7及以前

通过-xx:Permsize来设置永久代初始分配空间。默认值是20.75M -XX:MaxPermsize来设定永久代最大可分配空间。32位机器默认是64M,64位机器模式是82M 当JVM加载的类信息容量超过了这个值,会报异常OutofMemoryError:PermGen space。

​

JDK8以后

元数据区大小可以使用参数 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize指定,注意等于号,是赋值操作。

​默认值依赖于平台。windows下,-XX:MetaspaceSize是21M(约数),-XX:MaxMetaspaceSize的值是-1,即没有限制。

与永久代不同,如果不指定大小,默认情况下,虚拟机会耗尽所有的可用系统内存。如果元数据区发生溢出,虚拟机一样会抛出异常 OutOfMemoryError:Metaspace -XX:MetaspaceSize:设置初始的元空间大小。对于一个64位的服务器端JVM来说,其默认的 -xx:MetaspaceSize值为21MB。这就是初始的高水位线,一旦触及这个水位线,Ful1GC将会被触发并卸载没用的类(即这些类对应的类加载器不再存活)然后这个高水位线将会重置。新的高水位线的值取决于GC后释放了多少元空间。如果释放的空间不足,那么在不超过MaxMetaspaceSize时,适当提高该值。如果释放空间过多,则适当降低该值。 如果初始化的高水位线设置过低,上述高水位线调整情况会发生很多次。通过垃圾回收器的日志可以观察到Ful1GC多次调用。为了避免频繁地GC,建议将-XX:MetaspaceSize设置为一个相对较高的值。

如何解决这些OOM

要解决ooM异常或heap space的异常,一般的手段是首先通过内存映像分析工具(如Ec1ipse Memory Analyzer)对dump出来的堆转储快照进行分析,重点是确认内存中的对象是否是必要的,也就是要先分清楚到底是出现了内存泄漏(Memory Leak)还是内存溢出(Memory Overflow) 内存泄漏就是 有大量的引用指向某些对象,但是这些对象以后不会使用了,但是因为它们还和GC ROOT有关联,所以导致以后这些对象也不会被回收,这就是内存泄漏的问题 如果是内存泄漏,可进一步通过工具查看泄漏对象到GC Roots的引用链。于是就能找到泄漏对象是通过怎样的路径与GCRoots相关联并导致垃圾收集器无法自动回收它们的。掌握了泄漏对象的类型信息,以及GCRoots引用链的信息,就可以比较准确地定位出泄漏代码的位置。 如果不存在内存泄漏,换句话说就是内存中的对象确实都还必须存活着,那就应当检查虚拟机的堆参数(-Xmx与-Xms),与机器物理内存对比看是否还可以调大,从代码上检查是否存在某些对象生命周期过长、持有状态时间过长的情况,尝试减少程序运行期的内存消耗。

方法区的内部结构

类型信息

对每个加载的类型( 类 class、接口 interface、枚举 enum、注解 annotation),JVM 必须在方法区中存储以下类型信息:

  1. 这个类型的完整有效名称(全名=包名.类名)

  2. 这个类型直接父类的完整有效名(对于 interface 或是 java. lang.Object ,都没有父类)

  3. 这个类型的修饰符( public , abstract, final 的某个子集)

  4. 这个类型直接接口的一个有序列表

域(Field)信息

  • JVM必须在方法区中保存类型的所有域(field,也称为属性)的相关信息以及域的声明顺序;

  • 域的相关信息包括:域名称、 域类型、域修饰符(public, private,protected, static, final, volatile, transient 的某个子集)

方法(Method)信息

JVM 必须保存所有方法的以下信息,同域信息一样包括声明顺序:

  • 方法名称

  • 方法的返回类型(或void)

  • 方法参数的数量和类型(按顺序)

  • 方法的修饰符(public, private, protected, static, final,synchronized, native , abstract 的一个子集)

  • 方法的字节码(bytecodes)、操作数栈、局部变量表及大小( abstract 和 native 方法除外)

  • 异常表( abstract 和 native 方法除外)每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引

non-final 的类变量

  • 静态变量和类关联在一起,随着类的加载而加载,他们成为类数据在逻辑上的一部分

  • 类变量被类的所有实例所共享,即使没有类实例你也可以访问它。

我们可以通过例子来查看:

public class MethodAreaDemo2 { public static void main(String[] args) { Order order = null; order.hello(); System.out.println(order.count); } } class Order { public static int count = 1; public static final int number = 2; public static void hello() { System.out.println("hello!"); } 复制代码

运行结果为:

hello! 1 复制代码

可以打开 IDEA 的 Terminal 窗口,在 MethodAreaDemo2.class 所在的路径下,输入 javap -v -p MethodAreaDemo2.class 命令

​通过图片我们可以看出被声明为 final 的类变量的处理方法是不一样的,全局常量在编译的时候就被分配了。

运行时常量池

说到运行时常量池,我们先来了解一下什么是常量池表。

常量池表

一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息那就是常量池表(Constant Pool Table),里边存储着数量值、字符串值、类引用、字段引用和方法引用。

​为什么字节码文件需要常量池?

java 源文件中的类、接口,编译后会产生一个字节码文件。而字节码文件需要数据支持,通常这种数据会很大,以至于不能直接存放到字节码中。换一种方式,可以将指向这些数据的符号引用存到字节码文件的常量池中,这样字节码只需使用常量池就可以在运行时通过动态链接找到相应的数据并使用。

运行时常量池

运行时常量池( Runtime Constant Pool)是方法区的一部分,类加载器加载字节码文件时,将常量池表加载进方法区的运行时常量池。运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。此时不再是常量池中的符号地址了,这里换为真实地址。

运行时常量池,相对于 Class 文件常量池的另一重要特征是:具备动态性,比如 String.intern()。

演进细节

针对的是 Hotspot 的虚拟机:

  • jdk1.6 及之前:有永久代 ,静态变量存放在永久代上;

  • jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中;

  • jdk1.8及之后:无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中;

演变示例图

​

​

​

为什么要将永久代替换为元空间呢?

  1. 永久代使用的是 JVM 的内存,受 JVM 设置的内存大小限制;元空间使用的是本地直接内存,它的最大可分配空间是系统可用内存的空间。因为元空间里存放的是类的元数据,所以随着内存空间的增大,能加载的类就更多了,相应的溢出的机率会大大减小。

  2. 在 JDK8,合并 HotSpot 和 JRockit 的代码时,JRockit 从来没有一个叫永久代的东西,合并之后就没有必要额外的设置这么一个永久代的地方了。

  3. 对永久代进行调优是很困难的。

StringTable 为什么要调整

因为永久代的回收效率很低,在 full gc 的时候才会触发。而 full GC 是老年代的空间不足、永久代不足时才会触发。这就导致了StringTable 回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。

垃圾回收

相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。方法区的垃圾收集主要回收两部分内容:常量池中废奔的常量和不再使用的类型。

方法区内常量池中主要存放字面量和符号引用两大类常量:

  • 字面量比较接近 Java 语言层次的常量概念,如文本字符串、被声明为 final 的常量值等。

  • 符号引用则属于编译原理方面的概念,包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。

HotSpot 虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收。

类型判定

判定一个常量是否“废弃”还是相对简单,而要判定一个类型是否属于“不再被使用的类”的条件就比较苛刻了。需要同时满足下面三个条件:

  • 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类及其任何派生子类的实例;

  • 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则通常是很难达成的;

  • 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

Java 虛拟机被允许对满足上述三个条件的无用类进行回收,这里说的仅仅是“被允许”,而并不是和对象一样,没有引用了就必然会回收。

深入理解JVM(一)——JVM内存模型 JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区。下面对这五个区域展开深入的介绍。 1. 程序计数器1.1. 什么是程序计数器?程序计数器是一块较小的内存空间,可以把它看作当前线程正在执行的字节码的行号指示器。也就是说,程序计数器里面记录的是 阅读详情

相关推荐

深入理解Java的JVM内存模型

JVM内存模型定义了Java程序在执行时如何分配和管理内存。JMM的主要目的是屏蔽不同硬件、操作系统的内存访问差异,确保Java程序在各种环境下都能获得一致的执行效果。在JVM中,内存分为多个区域,每个区域负责不同类型的数据存储。这些区域大致包括方法区、堆、栈、本地方法栈和程序计数器。

Luffy的博客 1326

JVM 方法区(Method Area)

JVM 方法区 文章目录JVM 方法区方法区的理解栈、堆、方法区的交互关系HotSpot中方法区的演进永久代为什么要使用元空间替换字符串常量池(StringTable)为什么要调整方法区的内部结构类型信息域(Field)信息方法(Method)信息代码举例non-final 类型的类变量全局常量 static final运行时常量池解释常量池和运行时常量池方法区的垃圾回收类卸载常见面试题 方法区的理解 运行时数据区: 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已

TheAnnoyingDog的博客 3859

【JVM】jvm中的方法区简介

方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也是在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间。静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量在堆内存中,和方法区无关。一句话总结本文内容:方法区是JVM中一块内存区域,被线程共享,用来存放被static修改的、被final修改的、Class模板和常量池。

No8g攻城狮的博客 1194

JVM方法区(最详细)

系列文章目录 上述的文章我们了解了除了方法区外的运行时数据区,本文我们着重来讲解方法区。 方法区系列文章目录一、方法区的含义二、栈、方法区、堆之间的联系三、方法区详情1.方法区的演进1.1、永久代(PermGen)1.2、元空间(MetaSpace)2.方法区大小参数设置3.方法区的内部结构1.类型信息2.域信息3.方法信息总结 一、方法区的含义 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等

weixin_45969711的博客 2783

org.objectweb.asm-3.3.1.v201105211655.jar

asm字节码jar包,仅需要一个就可以。具体使用,可以参考http://blog.youkuaiyun.com/gaoshan12345678910/article/details/78131784

On the convergence of FedAvg on non-iid data

On the convergence of FedAvg on non-iid data

Lyn_S的博客 7082

并发2--java内存模型&jvm内存结构&java对象模型

要更好的理解并发问题,需要理解三个概念 jvm内存结构 java内存模型 java对象模型 jvm内存结构 众所周知,java是运行在jvm虚拟机上,而虚拟机会将所管理的内存划分为若干个不同的数据区域,如图(图片网上拷的) 方法区 方法区在以前的版本也可以称之为永久代,主要用于存储已被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码等数据。 虚拟机栈 java虚拟机栈是线程...

weixin_43417075的博客 537

基于PLC的冲压件自动生产线电气系统设计【附数据】

考虑到生产线的高效运行和维护简便性,选择了三菱FX系列的可编程逻辑控制器(PLC)作为核心控制单元,该型号的PLC因其高可靠性和强大的功能集,在工业自动化领域有着广泛的应用。最后,在完成初步的软件开发后,进行了多轮次的模拟测试和现场调试,逐步修正了存在的问题,最终达到了预期的功能要求。例如,对于进料环节,选用了光电传感器以精确检测物料的位置;此外,为了适应不同尺寸的工件加工需求,还特别设计了一套可调节的夹具系统,不仅提高了生产线的灵活性,同时也降低了更换模具的成本。✅ 感恩科研路上每一位志同道合的伙伴!

lagougongzuoshi的博客 1294

JVM入门必看——JVM结构

这一节,主要来学习jvm的基本结构,也就是概述。说是概述,内容很多,而且概念量也很大,不过关于概念方面,你不用担心,我完全有信心,让概念在你的脑子里变成图形,所以只要你有耐心,仔细,认真,并发挥你的想象力,这一章之后你会充满自信。当然,不是说看完本章,就对jvm了解了,jvm要学习的知识实在是非常的多。在你看完本节之后,后续我们还会来学jvm的细节,但是如果你在学习完本节的前提下去学习,再学习其他jvm的细节会事半功倍。为了让你每一个知识点都有迹可循,希望你按照我的步骤一步步继续。-------------

Firstlucky77的博客 421

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 707

用74LS160和74LS194搭个复古流水灯:从Multisim仿真到面包板实战(附完整电路图)

本文详细介绍了如何使用74LS160和74LS194芯片搭建复古流水灯电路,从Multisim仿真到面包板实战的全过程。通过解析核心器件特性、提供完整材料清单、仿真验证电路逻辑,以及实际搭建中的布局规划和调试技巧,帮助电子爱好者掌握这一经典数字电路设计项目。

weixin_28736355的博客 389

Java虚拟机:内存模型与核心机制

本文深入解析Java虚拟机(JVM)的内存结构和工作机制。主要内容包括:1) JVM整体架构和核心组件;2) 类加载子系统的工作流程;3) Java堆的分代管理;4) 栈帧结构和调用机制;5) 方法区存储内容;6) 堆、栈、方法区的协同工作;7) 其他重要组件如直接内存和本地方法栈;8) JVM参数设置实践。文章通过代码示例详细说明了StackOverflowError的产生原因,并对比了不同内存区域的特性和异常类型,帮助开发者建立完整的JVM知识体系。

2403_87729201的博客 361

基于Matlab的深度学习OFDM系统信号检测

在接收端,我们首先去除循环前缀,然后对接收到的信号进行FFT变换和QAM解调。在通信系统中,正交频分复用(Orthogonal Frequency Division Multiplexing,OFDM)是一种常用的调制技术,它可以将高速数据流分成若干个低速子载波进行传输,提高了信道利用率和抗干扰性能。接下来,我们使用训练好的神经网络对QAM调制后的数据进行检测,得到估计的FFT变换结果。深度学习方法可以通过大量的训练数据来学习信号的特征,并具有一定的适应能力,在某些情况下可能能够获得更好的检测性能。

2301_79325657的博客 296

异常将上下文初始化事件发送到类的侦听器实例_深入浅出JVM性能调优——JVM内存模型和类加载运行机制...

一、JVM内存模型运行一个 Java 应用程序,必须要先安装 JDK 或者 JRE 包。因为 Java 应用在编译后会变成字节码,通过字节码运行在 JVM 中,而 JVM 是 JRE 的核心组成部分。JVM 不仅承担了 Java 字节码的分析和执行,同时也内置了自动内存分配管理机制。这个机制可以大大降低手动分配回收机制可能带来的内存泄露和内存溢出风险,使 Java 开发人员不需要关注每个...

weixin_40000301的博客 284

NSIS教程(8): 基于第三方界面库的安装包界面

前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了nsDialogs.nsh来支持这些功能,但使用起来还是不太方便(需要专门了解这个插件诸多用法),而且不够灵活,所以本文介绍一种终极的自定义界面的安装包解决方案,即完全使用第三方

while(1) { smile(); } 9万+

[HQChart教程] 去掉“仅学习使用”文字提示的小技巧

最近用 HQChart 做图表时,发现左下角有“仅学习使用”的字样。这种水印虽然是默认的,但如果要展示给客户,可能会显得不够专业。还好,这个问题很好解决,只需要简单修改一下配置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 599

Carson带你学JVM:图文解析Java虚拟机内存结构

本文将全面讲解Java虚拟机中的内存模型 & 分区,希望你们会喜欢

Carson带你学Android 2万+

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程)

这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。

李同学Lino的博客 2355

深入理解Java内存模型(JMM)与虚拟机的内存结构(JVM)

在Java编程世界中,Java内存模型(Java Memory Model,简称JMM)和Java虚拟机(Java Virtual Machine,简称JVM)的内存结构是两个核心概念。它们对于理解Java程序的执行方式、性能优化以及并发编程至关重要。尽管这两个概念紧密相连,但它们的职责和特性却各不相同。本文将详细探讨Java内存模型与Java虚拟机的内存结构,帮助读者更深入地理解它们之间的关系和差异。

码到三十五 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存模型,这就是几个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存模型这几个的概念及其...

Soinice的博客 3496

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深入理解JVM虚拟机

JVM架构图: 类装载器: 沙箱安全机制: Execution Engine执行引擎负责解释命令,提交操作系统执行。 Native Method Stack本地方法栈:运行本地方法的栈 Program Counter Register即PC寄存器(程序计数器) 程序计数器底层是bytecode pointer(bcp)即字节码指针 PC寄存器是用来存储指向下一条指令的地址,也即将要执行的指令代码。由执行引擎读取下一条指令。 1.它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域...

识时务者的个人博客 14万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JVM虚拟机(一)介绍、JVM内存模型、JAVA内存模型,堆区、虚拟机栈、本地方法栈、方法区、常量池

深入理解Java语言:了解JVM的工作原理可以帮助你更深入地理解Java语言的运行机制,包括字节码的编译和执行过程;以及JVM的一些概念和技术,如垃圾收集、内存管理等。 改进代码质量:了解JVM的内存模型和并发模型可以帮助你编写更高质量的代码,避免死锁和竞态条件等问题。 性能优化:掌握JVM的知识能让你更有效地进行性能调优。你可以分析和理解垃圾收集器的行为,优化内存使用,减少延迟和提高吞吐量。 故障排查:当遇到内存泄漏、栈溢出、CPU飙高或其他JVM相关的问题时,对JVM的了解可以帮助你快速定位和解决问题

m0_52767002的博客 1050

深入理解java虚拟机(一)JVM内存模型

文章目录前言一、JVM内存模型1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区6.运行时常量池7.直接内存二、HotSpot虚拟机对象探秘1.对象的创建2.对象的内存布局3.对象的访问定位结尾 前言 对于从事C、 C++程序开发的开发人员来说,在内存管理领域,他们既是拥有最高权力的“皇帝”,又是从事最基础工作的劳动人民——既拥有每一个对象的“所有权”,又担负着每一个对象生命从开始到终结的维护责任。 对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作

少说,多做 1万+

深入理解java虚拟机(一)----jvm内存模型

最近大致的学习了一下jvm的相关技术,发现深入理解java虚拟机这本书很不错,所以想将这本书的内容的重难点在blog总结一下,一是为了巩固这些知识,二是为了把这些重点单独写出来,让初学者在学习的时候有一个大致的框架以至于学起来不至于那么迷茫学习java虚拟机,有两个最重要的机制需要知道: 1. 自动内存管理机制 2. 虚拟机执行子系统 下面将首先介绍jvm的自动内存管理机制:java和c++之

jingwen的博客 1万+

深入理解Java虚拟机内存模型

Java虚拟机(JVM)内存模型是Java程序员必须掌握的核心技术之一,不仅关系到程序性能优化、故障诊断,更是面试中的高频考点。据不完全统计,在Java中高级岗位面试中,JVM相关问题的出现概率高达85%!本文将带你系统性地学习JVM内存模型,从基础概念到高级应用,从学习复习到面试准备,全方位提升你的JVM功力。

aakhvb的博客 1130

深入解析Java虚拟机(JVM)内存模型-全面掌握JVM内存管理

JVM内存模型是Java虚拟机管理内存的方式,它定义了Java程序在运行时如何存储和访问数据。理解JVM内存模型对于编写高效的Java代码、诊断内存相关问题以及优化应用性能至关重要。堆(Heap)方法区(Method Area)程序计数器(Program Counter Register)本地方法栈(Native Method Stack)虚拟机栈(VM Stack)接下来,我们将详细介绍每个区域的特点和作用。

一个8年大数据开发工程师的碎碎念 2074
上一篇: 盘点解析SpringIOC : BeanDefinition 的加载流程
下一篇: 什么是JVM系列的javaagent
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值