【JVM】HotspotJVM内存区域解析

1、HotSpot And OpenJDK And OracleJDK And JER区别 学习java前我们先了解下这几个词的区别,HotSpot、JDK、JRE、OpenJDK、Oracle JDK 一、HotSpot HotSpot是JVM(Java Virtual Machine),是一个运行Java字节码的虚拟机,具有语言无关性和平台无关性。平台无关性:我们java编写的程序可以运行在window、mac、Linux上就是HotSpot的平台无关性。 语言无关性:比如Java、kotlin、Scala、Clojure、Groovy、Jython、JRuby、Ceylon、Eta、Ha 阅读详情

本文导读

本文详细的讲述了Java虚拟机运行时数据区的程序计数器、虚拟机栈,本地方法栈,方法区,堆,常量池,以及直接内存(堆外内存),对各个区域的作用,服务对象以及其中可能产生的问题展开讨论~

JVM基础知识

JVM 全称是 Java Virtual Machine,也就是我们耳熟能详的 Java 虚拟机。它能识别 .class 后缀的文件,并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作。

JVM是一个庞大的知识体系,可以从内存结构,内存分配策略,垃圾回收,性能监控工具,类文件结构,类加载机制,字节码执行引擎,JVM自身优化技术,程序性能调优几个方面去学习。

内存结构是了解JVM核心也是前提,同时 JVM 是一个虚拟化的操作系统,所以除了要虚拟指令之外,最重要的一个事情就是需要虚拟化内存。

JVM内存区域

这里讲解的是JVM内存的各个区域,重点讲解这些区域的作用,服务对象以及其中可能产生的问题。

宏观上JVM处于图片中虚线的位置,本篇重点讲解JVM运行时数据区

定义:Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域,该区域内存主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈等。同时按照与线程的关系也可以这么划分区域:线程私有区域:一个线程拥有单独的一份内存区域。线程共享区域:被所有线程共享,且只有一份。这里还有一个直接内存,这个虽然不是运行时数据区的一部分,但是会被频繁使用。你可以理解成没有被虚拟机化的操作系统上的其他内存(比如操作系统上有 8G 内存,被 JVM 虚拟化了 3G,那么还剩余 5G, JVM 是借助一些工具使用这 5G 内存的,这个内存部分称之为直接内存)

程序计数器(Program Counter Register)

程序计数器是一块很小的内存空间,是当前线程执行的字节码的行号指示器,各线程之间独立存储,互不影响。主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。因为 JVM 是虚拟机,内部有完整的指令与执行的一套流程,所以在运行 Java 方法的时候需要使用程序计数器(记录字节码执行的地址或行号),如果是遇到本地方法(native 方法),这个方法不是 JVM 来具体执行,所以程序计数器不需要记录了,这个是因为在操作系统层面也有一个程序计数器,这个会记录本地代码的执行的地址,所以在执行 native 方法时,JVM 中程序计数器的值为空(Undefined)。另外程序计数器也是 JVM 中唯一不会 OOM(OutOfMemory)的内存区域。

虚拟机栈(VM Stack)

虚拟机栈是线程运行 java 方法所需的数据,指令、返回地址。栈的数据结构是先进后出(FILO)的数据结构,虚拟机栈的作用,在 JVM 运行过程中存储当前线程运行方法所需的数据,指令、返回地址 。虚拟机栈是基于线程的:哪怕你只有一个 main() 方法,也是以线程的方式运行的。在线程的生命周期中,参与计算的数据会频繁地入栈和出栈,栈的生命周期是和线程一样的。虚拟机栈的大小缺省为 1M,可用参数 –Xss 调整大小,例如-Xss256k。参数官方文档(JDK1.8):docs.oracle.com/javase/8/do…

栈帧:在每个 Java 方法被调用的时候,都会创建一个栈帧,并入栈。一旦方法完成相应的调用,则出栈。

栈帧大体都包含四个区域:局部变量表、操作数栈、动态连接、返回地址一、局部变量表: 顾名思义就是局部变量的表,用于存放我们的局部变量的(方法中的变量)。首先它是一个 32 位的长度,主要存放我们的 Java 的八大基础数据类型,一般 32 位就可以存放下,如果是 64 位的就使用高低位占用两个也可以存放下,如果是局部的一些对象,比如我们的 Object 对象,我们只需要存放它的一个引用地址即可。局部变量表在编译期间完成分配,方法在栈帧中分配多大内存是完全确定的,在方法运行期间不会改变局部变量表的大小。二、操作数据栈: 存放 java 方法执行的操作数的,它就是一个栈,先进后出的栈结构,操作数栈,就是用来操作的,操作的的元素可以是任意的 java 数据类型,所以我们知道一个方法刚刚开始的时候,这个方法的操作数栈就是空的。操作数栈本质上是 JVM 执行引擎的一个工作区,也就是方法在执行,才会对操作数栈进行操作,如果代码不不执行,操作数栈其实就是空的。三、动态连接: Java 语言特性多态(后续章节细讲,需要结合 class 与执行引擎一起来讲)。四、返回地址: 正常返回(调用程序计数器中的地址作为返回)、异常的话(通过异常处理器表<非栈帧中的>来确定)同时,虚拟机栈这个内存也不是无限大,它有大小限制,默认情况下是 1M。如果我们不断的往虚拟机栈中入栈帧,但是就是不出栈的话,那么这个虚拟机栈就会爆掉(例如方法D()会抛出Exception in thread "main" java.lang.StackOverflowError)。

public class MethodAndStack {
    public static void main(String[] args) {
        A();
    }
    public static void A() {
        B();
    }
    public static void B() {
        C();
    }
    public static void C() {
    }
    public static void D() {
        D()
    }
}

这段代码很简单,就是起一个 main 方法,在 main 方法运行中调用 A 方法,A方法中调用 B 方法,B方法中运行C方法。我们把代码跑起来,线程1来运行这段代码, 线程1跑起来,就会有一个对应 的虚拟机栈,同时在执行每个方法的时候都会打包成一个栈帧。比如 main 开始运行,打包一个栈帧送入到虚拟机栈。C 方法运行完了,C 方法出栈,接着 B 方法运行完了,B 方法出栈、接着 A 方法运行完了,A 方法出栈,最后 main 方法运行完了,main 方法这个栈帧就出栈了。这个就是 Java 方法运行对虚拟机栈的一个影响。虚拟机栈就是用来存储线程运行方法中的数据的。而每一个方法对应一个栈帧。

本地方法栈(Native Method Stact)

本地方法栈跟 Java 虚拟机栈的功能类似,Java 虚拟机栈用于管理 Java 函数的调用,而本地方法栈则用于管理本地方法的调用。但本地方法并不是用 Java 实现的,而是由 C 语言实现的(比如 Object.hashcode 方法)。本地方法栈是和虚拟机栈非常相似的一个区域,它服务的对象是 native 方法。你甚至可以认为虚拟机栈和本地方法栈是同一个区域。虚拟机规范无强制规定,各版本虚拟机自由实现 ,HotSpot 直接把本地方法栈和虚拟机栈合二为一 。本地方法栈也会抛出StackOverflowError和OutOfMemorryError,上述说过程序计数器不会记录本地方法栈。

方法区(Method Area)

方法区主要是用来存放已被虚拟机加载的类相关信息,包括类信息、静态变量、常量、运行时常量池、字符串常量池等。方法区是 JVM 对内存的“逻辑划分”,在 JDK1.7 及之前很多开发者都习惯将方法区称为“永久代”,是因为在 HotSpot 虚拟机中,设计人员使用了永久代来实现了 JVM 规范的方法区。在 JDK1.8 及以后使用了元空间来实现方法区。JVM 在执行某个类的时候,必须先加载。在加载类(加载、验证、准备、解析、初始化)的时候,JVM 会先加载 class 文件,而在 class 文件中除了有类的版本、字段、方法和接口等描述信息外,还有一项信息是常量池 (Constant Pool Table),用于存放编译期间生成的各种字面量和符号引用。字面量包括字符串(String a=“b”)、基本类型的常量(final 修饰的变量),符号引用则包括类和方法的全限定名(例如 String 这个类,它的全限定名就是 Java/lang/String)、字段的名称和描述符以及方法的名称和描述符。JDK1.7的HotSpot中,已经把原本放入永久代的字符串常量池移出(java常量池不在堆中也不在栈中,是独立的内存空间管理。常量池:存放字符串常量和基本类型常量)

元空间(class metadata)

方法区与堆空间类似,也是一个共享内存区,所以方法区是线程共享的。假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有装入 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。在 HotSpot 虚拟机、Java7 版本中已经将永久代的静态变量和运行时常量池转移到了堆中,其余部分则存储在 JVM 的非堆内存中,而 Java8 版本已经将方法区中实现的永久代去掉了,并用元空间(class metadata)代替了之前的永久代,并且元空间的存储位置是本地内存。

元空间大小参数:jdk1.7 及以前(初始和最大值):-XX:PermSize;-XX:MaxPermSize;jdk1.8 以后(初始和最大值):-XX:MetaspaceSize; -XX:MaxMetaspaceSizejdk1.8 以后大小就只受本机总内存的限制(如果不设置参数的话)JVM 参数参考:docs.oracle.com/javase/8/do…

Java8 为什么使用元空间替代永久代,这样做有什么好处呢? 官方给出的解释是:移除永久代是为了融合 HotSpot JVM 与 JRockit VM 而做出的努力,因为 JRockit 没有永久代,所以不需要配置永久代。永久代内存经常不够用或发生内存溢出,抛出异常 java.lang.OutOfMemoryError: PermGen。这是因为在 JDK1.7 版本中,指定的 PermGen 区大小为8M,由于 PermGen 中类的元数据信息在每次 FullGC 的时候都可能被收集,回收率都偏低,成绩很难令人满意;还有为 PermGen 分配多大的空间很难确定,PermSize 的大小依赖于很多因素,比如,JVM 加载的 class 总数、常量池的大小和方法的大小等。

常量池与运行时常量池(Constant pool and Runtime Constant Pool)

而当类加载到内存中后,JVM 就会将 class 文件常量池中的内容存放到运行时的常量池中;在解析阶段,JVM 会把符号引用替换为直接引用(对象的索引值)。例如,类中的一个字符串常量在 class 文件中时,存放在 class 文件常量池中的;在 JVM 加载完类之后,JVM 会将这个字符串常量放到运行时常量池中,并在解析阶段,指定该字符串对象的索引值。运行时常量池是全局共享的,多个类共用一个运行时常量池,class 文件中常量池多个相同的字符串在运行时常量池只会存在一份。

常量池有很多概念,包括运行时常量池、class 常量池、字符串常量池。虚拟机规范只规定以上区域属于方法区,并没有规定虚拟机厂商的实现。严格来说是静态常量池和运行时常量池,静态常量池是存放字符串字面量、符号引用以及类和方法的信息,而运行时常量池存放的是运行时一些直接引用。运行时常量池并不只有编译期能产生(预置入Class文件中),运行期间也可能产生新的常量池(使用较多是String类的intern()方法)

运行时常量池是在类加载完成之后,将静态常量池中的符号引用值转存到运行时常量池中,类在解析之后,将符号引用替换成直接引用。运行时常量池在 JDK1.7 版本之后,就移到堆内存中了,这里指的是物理空间,而逻辑上还是属于方法区(方法区是逻辑分区)。所谓静态常量池,也就是上图*.class文件中的常量池。

堆(Heap)

堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。堆空间一般是程序启动时,就申请了,但是并不一定会全部使用。堆一般设置成可伸缩的。随着对象的频繁创建,堆空间占用的越来越多,就需要不定期的对不再使用的对象进行回收。这个在 Java 中,就叫作 GC(Garbage Collection)。

那一个对象创建的时候,到底是在堆上分配,还是在栈上分配呢?这和两个方面有关:对象的类型和在 Java 类中存在的位置。Java 的对象可以分为基本数据类型和普通对象。对于普通对象来说,JVM 会首先在堆上创建对象,然后在其他地方使用的其实是它的引用。比如,把这个引用保存在虚拟机栈的局部变量表中。对于基本数据类型来说(byte、short、int、long、float、double、char),有两种情况。当你在方法体内声明了基本数据类型的对象,它就会在栈上直接分配。其他情况,都是在堆上分配。

堆大小参数:-Xms:堆的最小值;-Xmx:堆的最大值;-Xmn:新生代的大小;-XX:NewSize;新生代最小值;-XX:MaxNewSize:新生代最大值;例如- Xmx256m

符号引用

符号引用则属于编译原理方面的概念,包括了如下三种类型的常量:类和接口的全限定名、字段名称和描述符、方法名称和描述符。

一个 java 类(假设为 People 类)被编译成一个 class 文件时,如果 People 类引用了 Tool 类,但是在编译时 People 类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。而在类装载器装载 People 类时,此时可以通过虚拟机获取 Tool 类的实际内存地址,因此便可以既将符号 org.simple.Tool 替换为 Tool 类的实际内存地址,及直接引用地址。

即在编译时用符号引用来代替引用类,在加载时再通过虚拟机获取该引用类的实际地址,以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机实现的内存布局是无关的,引用的目标不一定已经加载到内存中。

直接内存(堆外内存)

直接内存有一种更加科学的叫法,堆外内存。JVM 在运行时,会从操作系统申请大块的堆内存,进行数据的存储;同时还有虚拟机栈、本地方法栈和程序计数器,这块称之为栈区。操作系统剩余的内存也就是堆外内存。它不是虚拟机运行时数据区的一部分,也不是 java 虚拟机规范中定义的内存区域;如果使用了 NIO,这块区域会被频繁使用,在 java 堆内可以用directByteBuffer 对象直接引用并操作;

这块内存不受 java 堆大小限制,但受本机总内存的限制,可以通过-XX:MaxDirectMemorySize 来设置(默认与堆内存最大值一样),所以也会出现 OOM 异常。

1、直接内存主要是通过 DirectByteBuffer 申请的内存,可以使用参数“MaxDirectMemorySize”来限制它的大小。2、其他堆外内存,主要是指使用了 Unsafe 或者其他 JNI 手段直接直接申请的内存。

堆外内存的泄漏是非常严重的,它的排查难度高、影响大,甚至会造成主机的死亡。后续章节会详细讲。

同时,要注意 Oracle 之前 计划在 Java 9 中去掉 sun.misc.Unsafe API 。这里删除 sun.misc.Unsafe 的原因之一是使 Java 更加安全,并且有替代方案。目前我们主要针对的 JDK1.8 ,JDK1.9 暂时不放入讨论范围中,我们大致知道 java 的发展即可。

深入理解HotSpot JVM 基本原理 它保存所有被JVM加载的类和接口的运行时常量池,成员变量以及方法的信息,静态变量以及方法的字节码。每条线程还有自己的工作内存(Working Memory,可与前面讲的处理器高速缓存类比),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。禁止指令重排序优化,普通的变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。 阅读详情

相关推荐

MCNP 减方差技巧(最全)

MCNP的减方差技巧,核心在于不显著增加计算时间的前提下,通过修改模拟过程来降低结果的统计误差。尤其适用于,这类问题中粒子很难到达探测器区域,直接模拟效率极低栅元重要性是常用的减方差技巧,该方法主要对计算模型的不同区域定义不同的重要性数值。当粒子从重要性低的区域废物重要性高的区域,产生更多粒子,增大统计量;当从重要性高的区域进入重要性低的区域,会进行,增快计算效率。n= 中子,N;光子,P;电子 Exi= 栅元i的重要性I=栅元总数项目IMP卡是必须的,除非使用了WWN卡如果粒子进入0。

chencheng1127的博客 929

JVM(Hotspot)

JVM(Hotspot) 一.介绍 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 ##二.JVM结构图 2.1程序计数器(

qq_43369592的博客 2232

HCLR-Net: 混合对比学习正则化与局部随机扰动用于水下图像增强

独特贡献在于开发了一种处理负样本的新策略,既保留了负样本的统计特性,又防止网络过度剖析这些样本中的特征信息。通过根据每个通道特征的重要性对模型进行加权,我们可以增强富含上下文信息的通道,从而获得更准确、更详细的特征表示。AHA 模块利用垂直方向上的 Avgpool 和水平方向上的 Maxpool 来捕捉远程依赖关系和准确的位置信息,从而有效确定不同方向上的特征退化。对比学习策略通常旨在最小化正样本之间的欧氏距离,使预测图像更接近理想图像,同时最大化负样本与预测图像之间的距离,使它们进一步远离非理想表征。

G-Howe的博客 1459

JVM学习笔记002:垃圾回收

三、垃圾回收 1、如何判断对象可以回收 引用计数法 一个对象被引用+1,一个对象不再引用-1,为0时可以回收 弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放 可达性分析算法 根对象:肯定不能被回收的对象 JVM中的垃圾回收器通过可达性分析来探索所有存活的对象 扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收 可以作为GC Root的对象 虚拟机栈(栈帧中的本地变量表)中引用的对象。 方法区中类静态属性引用的对象 方法区中常量引用的对象

耿鬼不会笑的博客 466

海上AI导航系统:技术架构与行业应用解析

计算机视觉与强化学习技术在海上导航系统中的应用正逐步改变传统航运业。通过多模态传感器融合技术,现代AI导航系统能够实现高精度的物体识别与实时路径规划,有效解决能见度依赖、决策延迟等核心痛点。以Orca AI的SeaPod系统为例,其结合了NVIDIA GeForce RTX 4070的边缘计算能力与多光谱协同识别技术,在恶劣环境下仍能保持稳定性能。这类系统不仅提升了航行安全性,还通过优化航线显著降低燃油消耗,在东京湾、马六甲海峡等繁忙水域展现出巨大价值。随着毫米波雷达融合方案的测试推进,未来海上导航将突破极

weixin_33597080的博客 356

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

HotSpot与JVM概述

HotSpot到底是什么以及它与JVM和OpenJDK有什么关系?它到底是做什么的?另外,OpenJDK和HotSpot有什么区别? Java虚拟机规范 根据定义,JVM是虚拟机。即一个模拟真机操作的软件机器。像真机一样,它有一个指令集,一个虚拟计算机架构和一个执行模型。它能够运行用这个虚拟指令集编写的代码,就像真机可以运行机器代码一样。 HotSpot 是JVM概念的一个实现。它最初由Sun开发...

【莉婶】的博客 8249

Nvidia Jetson AGX Orin 如何进入 Recovery Mode(刷机注意事项)

Jetson Orin 如何进入Recovery mode + 刷机注意事项

Pandako's Blog 1万+

JVM面试题

JVM 一、基本概念 JVM是可运行Java代码的假想计算机,包括一套字节码指令集,一组寄存器,一个栈,一个垃圾回收器,一个堆,和一个存储方法域。JVM是运行在操作系统之上的,他与硬件没有直接的交互。 二、运行过程 ①Java源文件 ——>编译器——>字节码文件 ②字节码文件——>JVM——>机器码 每一种平台的解释器都是不同的,但是事项的虚拟机是相同的,这也就是Java为什么能够跨平台的原因了,当一个程序员从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。

qq_43259261的博客 281

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 505

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 690

java+分布式+计数_Java核心知识详解:JVM+微服务+分布式+设计模式+数据结构与算法...

(1) 基本概念:JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 (2) 运行过程:我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字节码文件,而字节码文件又通过 Java 虚拟机中的解释器,编译成特定机器上的机器码 。也就是如...

weixin_39929259的博客 278

22、用户界面流程(UI Flow)全解析

本文全面解析了用户界面流程(UI Flow)的概念、创建步骤及其在系统设计中的应用。通过示例和操作步骤,详细介绍了如何确定屏幕范围、识别屏幕、创建过渡和标记触发器,并阐述了UI Flow在导航识别、验证、可用性优化、测试用例开发和需求推导中的重要作用。文章还结合问答系统案例,展示了UI Flow的实际应用价值,帮助读者深入理解并有效运用这一工具提升系统用户体验。

rice5的博客 155

太牛了!终于有人对JVM下手了,面试必备,建议收藏

推荐阅读:蚂蚁三面被虐惨,原因竟是spring,jvm,mybatis,并发一窍不通 为面阿里P8,我肝了一份651个技术分支的脑图,要么?(限时领) 什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,对 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。 在这里插入图片描述 我们都知道 Java 源文件,通过编译器,能够生产相应的.Class 文件,也就是字...

文章中资料均可获取,有需要请添加yunduoa2019即可 248

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

「JVM」深入剖析HotspotJVM内存区域

本文详细的讲述了Java虚拟机运行时数据区的程序计数器、虚拟机栈,本地方法栈,方法区,堆,常量池,以及直接内存(堆外内存),对各个区域的作用,服务对象以及其中可能产生的问题展开讨论。

weixin_49307478的博客 210

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JVM内存区域(详细介绍)

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面常量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。与之相反,非守护线程也称为用户线程,它们是程序的主要执行部分。是被线程共享的一块内存区域,创建的对象和数组都保存在java堆内存中,也还是垃圾收集器进行垃圾收集的最重要的内存区域。(在JVM内,每个线程都与操作系统本地线程直接映射,因此这部分内存区域的存否随本地线程的生死对应)。

于枭森的博客 354

JVM运行时内存区域

下面讲解的内存区域划分,以及创建对象实例、对象内存布局、对象的访问都针对于HotSpot JVM来说。Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域:程序计数器:        是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复...

wangqiming168的博客 410

JVM内存

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,具体实现有很多,以下内容如果不额外声明,默认是HotSpot JVM。JVM它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息,,就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

m0_62226781的博客 942

JVM 内存布局及细节分析

引言 JVM在实际的开发过程中似乎从来都不用考虑这个东西,但是往往跳槽面试的时候有基本被问到。这里将自己看过的比较好的资料整理一下,防止自己忘记,内容有盗取成分。 本文主题内容: 1、JVM 内存区域概览2、堆区的空间分配是怎么样?堆溢出的演示3、创建一个新对象内存是怎么分配的?4、方法区 到 Metaspace 元空间5、栈帧是什么?栈帧里有什么?怎么理解?6、本地方法栈8、程序计数器9、...

xia_zai_pin_dao_的博客 280

java代码大全及详解_史上最全JVM大全详解!java程序员细节到极致的一次,魔鬼...

前言作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识。 JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。而大多数人可能没有对 JVM 的实际开发和使用经验,接下来这一系列文章将带你深入了解 JVM 需要掌握的各个知识点。这也将帮助你完成从初级程序员到高级程序员的转变。由于文章篇幅原因,文末有答案和解析目录线程(详解)JVM内存区域(详解)J...

weixin_39630515的博客 256

总结:Java内存区域

一、架构 下图是 JDK8 之后的 JVM 内存布局: ...

w2009211777的专栏 93

JVM方法区

方法区在 JVM 内存模型中扮演着重要角色,存储了类和方法的元数据以及常量池。了解方法区的工作机制和调优参数,有助于优化 Java 应用的性能和稳定性,避免内存相关的错误。

weixin_45990682的博客 357

内存区域详解(Eden Space、Survivor Space、Old Gen、Code Cache和Perm Gen)

1.内存区域划分 根据我们之前介绍的垃圾收集算法,限定商用虚拟机基本都采用分代收集算法进行垃圾回收。根据对象的生命周期的不同将内存划分为几块,然后根据各块的特点采用最适当的收集算法。大批对象死去、少量对象存活的,使用复制算法,复制成本低;对象存活率高、没有额外空间进行分配担保的,采用标记-清除算法或者标记-整理算法。 从上面的图可以看出, JVM区域总体分两类,heap区和非heap区。 1.h...

TOWOT的博客 507

8年开发架构师浅析SpringBoot的JVM的内存占用与Docker-spring

无论是哪家公司,都很重视Spring框架技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,好了希望这篇文章对大家有帮助!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

2401_84411776的博客 692

JVM复习(一):JVM内存模型、HotSpot虚拟机对象、垃圾回收算法、垃圾收集器、内存分配与回收策略

一、JVM内存模型 JVM运行时数据区域分为线程独占区和线程共享区,线程独占区包括虚拟机栈、本地方法栈、程序计数器,线程共享区包括堆和方法区 1、堆 堆是JVM内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Survivor和To Survivor...

hxt的博客 1041
上一篇: 模板、策略以及工厂模式
下一篇: 从数组当做map的key引发的思考
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值