JVM之内存篇

JVM 内存结构基于JDK1.8【JVM篇三】 在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在 Java 虚拟机内存中是如何存放的 ?Java 虚拟机在为类实例或成员变量分配内存是如何分配的 ?是的,这两个问题就涉及到了JVM 内存结构的知识了,那么这篇文章将进行解答。 文章目录1、内存结构还... 阅读详情

JAVA虚拟机之内存篇

目的:通过对JVM中内存结构的了解,可以处理常见的大部分内存溢出问题,并能大致定位到原因;更高级的希望知道各种框架的不同机制会对JVM内存占用造成哪些影响;

1. Java虚拟机是什么

要理解java虚拟机,你首先必须意识到,当你说“Java虚拟机”时,可能指的是如下三个不同的东西:

1. 抽象规范

2. 一个具体的实现(JVM+基本API)

3. 一个运行中的虚拟机实例

Java虚拟机的生命周期

 

      一个运行时的Java虚拟机实例的天职就是:负责运行一个 Java程序。当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出是,这个虚拟机实例也就随之消亡。如果在同一个计算机上同时运行三 个程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。

      Java虚拟机实例通过调用某个初始类的main()方法来运行一个Java程序,此方法将作为该程序初始线程的启动,任何其他的线程都是由这个初始线程启动的。

      在Java虚拟机内部有两种线程:守护线程与非守护线程。 守护线程通常是由虚拟机自己使用的,比如执行垃圾收集任务的线程。但是,Java程序也可以把他创建的任何线程标记为守护线程。而Java程序中的初始线程---------就是开始于main()的那个,是非守护进程。只要还有非守护线程在运行,那么这个Java程序也在继续运行(虚拟机仍然存活)。当 该程序中所有的非守护线程都终止时,虚拟机实例将自动退出。假若安全管理器允许,程序本身也能够通过调用Runtime类或者System类的exit()方法来退出。

Java虚拟机体系结构

我们主要关注的是JVM的内存结构,即runtime dataareas部分所示:

Method area(方法区):

主要用来存放类型信息,JVM读入class文件后,会对其进行解析,解析后的类型信息就放在方法区中,包括

【该类型的常量池】:存放该类定义的常量(final变量)

【字段信息】:变量名,类型,修饰符;

【方法信息】:方法名,返回类型,方法参数的数目和类型,修饰符;

【除了常量意外的所有类(静态)变量】:静态变量;

【一个到ClassLoader的引用】:类的装载器信息;

【一个到Class类的引用】:该class文件所对应的CLASS类实例;

【方法表】:存放非抽象类的方法,以方便对象调用;

Heap area(堆区)

用来存放对象数据,在JVM中对象的数据仅包括对象中所包含的非静态变量,其方法信息实际上是存在方法区中的;

Java Stack(JAVA栈)

JVM中的每一个线程都拥有一个JAVA栈

Pc register(PC寄存器)

用来存放每个线程当前指令的地址,故一般来说为32或64位,如果有多个线程,则有多个PC寄存器;很显然,其占用的内存非常之小,以至于在实际JVM实现中根本未将其专门分成一块区域,而且也不可能发生溢出;

Native mehthods stacks(本地方法栈)

JVM的基本API最终调用的是本地方法,而且JAVA也允许在JAVA中调用本地方法,本地方法调用也会产生线程栈;

 

需要特别说明的是:JAVA的垃圾收集算法仅仅针对的是Heap area(堆区),JVM规范中的内存区域指的是JVM必须包含的内存区,而JVM实现也可以包含其它的内存区域;

 

下面具体到一个具体的JAVA虚拟机实现(HOTSPOT JVM(SUN))来看其内存体系结构:

HOTSPOT JVM的内存组成:

1. 整个JAVA程序(即一个JAVA进程)所占用的内存即:1 JVM Process Heap,32位OS来说最多约2G,对于64位OS则更多(相当于无限);

2.  JVM规范中的Heap area(堆区)对应于JAVA ObjectHeap(可使用-Xms –Xmx来手动指定最大内存);

该区域又可分为:Young Generation和Old Genaration,

而Young Generation又可分为Eden Space(default 2M)和Survivor Space(default 64K)

Survivor Space区域分成对等的两块from和to

之后详述垃圾回收算法时可看到,这种分类的方法对应于不同对象的生存期的长短以及垃圾回收算法的不同;

3.  JVM规范中的Method area(方法区)对应于Permanent Space;

4.  JVM规范中的Java Stack(JAVA栈)对应于Threaded JVM Stack+ Native mehthodsstacks(本地方法栈); ,实际上每个JAVA线程都对应着OS中一个真实的线程,故任何一个JAVA线程其实同时对应着两个线程:JAVA线程和操作系统中的实际线程,同理,任何一个JAVA线程其实同时要占两份空间,即JAVA栈和操作系统栈;

5. Code Generation用于转换byte code 为native code.该区域用于JIT技术基本不会导致内存异常。如果该操作没有足够的空间,JVM可能会导致崩溃。

   JIT技术:just-in-time,该技术会将JAVA字节码编译为本地机器代码并缓存,下次执行时直接执行本地机器代码,而不再由JVM执行引擎来翻译再执行,当然,将所有的JAVA字节码都编译成本地机器代码并缓存将占用大量的空间,要据程序局部性原理,实际上JAVA中需要反复执行的代码只是某一小块,因此虚拟机会跟踪代码的执行次数,一旦某一组代码执行次数超过某个阀值,则以后直接执行本地代码,这样就获得了执行时间和所需内存空间的平衡,通过该技术,JAVA可以达到与C等代码相近的执行效率(这个是书上说的);

6. Socket Buffers

包括两部分:1:Receive buffer~37k   2:Send buffer ~25k,需要在JAVA代码中来控制他,所以在外部无法配置。可能导致的异常:IOException: Too many open files (for

example)

16、Direct Memory Space

 

他可以让开发人员映射内存到java Object Heap外。

配置: XX:MaxDirectMemorySize=<value>

 

 

17、JNI Code 、

 

JNI code本身使用的内存非常小。

 

19、JNI allocate memory

JNI 程序本身也需要分配内存。

 

 

18、Garbage Collection

 

其实GC也是需要内存的,gc线程的消耗以及存放GC所缓存的信息。

三、引起的异常

java.lang.OutOfMemoryError: Java heap space

原因:Heap内存溢出,意味着Young和Old generation的内存不够。

解决:调整java启动参数-Xms -Xmx 来增加Heap内存。

java.lang.OutOfMemoryError: unable to create new nativethread

原因:Stack空间不足以创建额外的线程,要么是创建的线程过多,要么是Stack空间确实小了。

解决:由于JVM没有提供参数设置总的stack空间大小,但可以设置单个线程栈的大小;而系统的用户空间一共是3G,除了Text/Data/BSS /MemoryMapping几个段之外,Heap和Stack空间的总量有限,是此消彼长的。因此遇到这个错误,可以通过两个途径解决:1.通过 -Xss启动参数减少单个线程栈大小,这样便能开更多线程(当然不能太小,太小会出现StackOverflowError);2.通过-Xms -Xmx 两参数减少Heap大小,将内存让给Stack(前提是保证Heap空间够用)。

java.lang.OutOfMemoryError: PermGen space

原因:Permanent Generation空间不足,不能加载额外的类。

解决:调整-XX:PermSize= -XX:MaxPermSize= 两个参数来增大PermGen内存。一般情况下,这两个参数不要手动设置,只要设置-Xmx足够大即可,JVM会自行选择合适的PermGen大小。

java.lang.OutOfMemoryError: Requested array size exceeds VMlimit

原因:这个错误比较少见(试着new一个长度1亿的数组看看),同样是由于Heap空间不足。如果需要new一个如此之大的数组,程序逻辑多半是不合理的。

解决:修改程序逻辑吧。或者也可以通过-Xmx来增大堆内存。

在GC花费了大量时间,却仅回收了少量内存时,也会报出OutOfMemoryError,我只遇到过一两次。当使用-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC收集器时,在上述情况下会报错,在HotSpot GC Turning文档 上有说明:

The parallel(concurrent) collector will throw anOutOfMemoryError if too much time is being spent in garbage collection: if morethan 98% of the total time is spent in garbage collection and less than 2% ofthe heap is recovered, an OutOfMemoryError will be thrown.

对这个问题,一是需要进行GC turning,二是需要优化程序逻辑。

java.lang.StackOverflowError

原因:这也内存溢出错误的一种,即线程栈的溢出,要么是方法调用层次过多(比如存在无限递归调用),要么是线程栈太小。

解决:优化程序设计,减少方法调用层次;调整-Xss参数增加线程栈大小。

 

IOException: Too many open files

原因: 这个是由于TCP connections 的buffer 大小不够用了。

 

java.lang.OutOfMemoryError:Direct buffer memory

 

解决:调整-XX:MaxDirectMemorySize=<value>

 

 

重要调优参数总结:

1.堆内存

-Xms -Xmx 来增加Heap内存:解决java.lang.OutOfMemoryError: Java heap space

事实上还有其它参数:

-XX:NewRatio=4   年轻代(包括Eden和Survivor):年老代Old=1:4

-XX:SurvivorRatio=4Eden:Survivor=1:4

-Xmn 设置年轻代的大小

2.方法区内存

 -XX:PermSize=-XX:MaxPermSize=来增加方法区内存,解决java.lang.OutOfMemoryError:PermGen space

方法区进行垃圾回收的条件:

该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

3.栈区内存

 -Xss 来增加栈区内存,解决java.lang.StackOverflowError

但一般来说,发生这种溢出的原因都是因为递归太多或存在死循环不断赋值,故如果出现该异常,通常要做的绝不是调参,而是修改程序;

4.

其它的不常见,故暂时不管;

 

JAVA的引用:

在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)四种,这四种引用强度依次逐渐减弱。
强引用就是指在程序代码之中普遍存在的,类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
      软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了SoftReference类来实现软引用。
弱引用 也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。在JDK 1.2之后,提供了WeakReference类来实现弱引用。
      虚引用也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被收集器回收时收到一个系统通知。在JDK 1.2之后,提供了PhantomReference类来实现虚引用。

 

垃圾回收算法:

垃圾回收算法有:引用记数(有缺陷,无法使用),标记-清扫,标记-整理,停止-复制,火车头算法;

 对于年轻代实行停止-复制(MinorGC)的垃圾回收算法,对于年龄达到n(经过n次的Minor GC)或相同年龄达到Survivor区的一半,移入年老代;软引用在年轻代中可依然存在,直到进行FULL GC时才被清除;

对于年老代,则实行标记-清扫或标记-整理垃圾回收算法,有时也会执行FULLGC(相当于系统中调用的System.gc());

特例:对于大对象(可通过参数确定何为大对象),会直接进行年老代;

执行FULL GC后,年轻代存在的对象会直接进行年老代(适用于SUN虚拟机);

 

调试工具和JAVA自带的函数:

工具个人用过的是JCONSOLE,在装有JDK的环境下,在命令窗口中打该命令即可得到;将其注入某个运行中的JAVA程序中,可观察其内存消耗情况,以及各代内存占用情况;

MemoryMXBean的getHeapMemoryUsage()方法返回记录heap区使用情况的对象

MemoryMXBean的getNonHeapMemoryUsage()方法返回记录方法区使用情况的对象

 

 


最新Mamba环境配置教程:从CUDA到causal-conv1d的完整安装流程 本文提供最新Mamba环境配置教程,涵盖从CUDA到causal-conv1d的完整安装流程。针对深度学习领域的长序列处理需求,详细指导如何正确配置CUDA工具链、安装PyTorch及关键依赖causal-conv1d,解决常见报错问题,并验证mamba-ssm集成效果。 阅读详情

相关推荐

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

JVM内存配置详解

<br />前段时间在一个项目的性能测试中又发生了一次OOM(Out of swap sapce),情形和以前网店版的那次差不多,比上次更奇怪的是,此次搞了几天之后啥都没调整系统就自动好了,死活没法再重现之前的OOM了!问题虽然蹊 跷,但也趁此机会再次对JVM堆模型、GC垃圾算法等进行了一次系统梳理;<br />基本概念<br /> 堆/Heap<br /> JVM管理的内存叫堆;在32Bit操作系统上有4G的限制,一般来说Windows下为2G,而Linux 下为3G;64Bit的就没有这个限制

xhh198781的专栏 1347

【软件分享】天若OCR文字识别V4.48(翻译功能免费)

软件简介 吾爱破解论坛大佬天若幽心开发的一款OCR文字识别工具。支持快速截图识别,以及文本翻译。 下载地址 蓝奏云盘:点击下载 百度网盘:点击下载(密码:4dm4) 坚果云盘:点击下载 天翼云盘:点击下载 微软云盘:点击下载 使用教程 1、下载后对压缩包进行解压 2、双击天若OCR文字识别.exe 3、发现桌面右下角出现软件图标 4、双击软件图标即可开始截图识别 原帖地址 https://www.52pojie.cn/thread-692917-1-1.html ...

XavierJ的博客 1万+

java虚拟机缓存多少_JVM缓存系统和方法与流程

本发明属于jvm(javavirtualmachine,java虚拟机)缓存技术领域,尤其设于一种jvm缓存系统和方法。背景技术:对响应速度要求较高的系统,往往采用如图1所示的java虚拟机,该java虚拟机采用堆内缓存101来解决从数据库中获取数据速度慢的问题,通过预加载流程可以优先加载数据到jvm的堆内缓存101中,使用数据时直接从堆内存中获取数据,通过这这个方案可以提升数据访问速度。但是,随...

weixin_29628479的博客 523

RK3568部署YOLOv8的7种方法对比:量化vs非量化的性能实测与优化建议

本文针对RK3568平台,深度对比了YOLOv8模型的七种部署方法,重点分析了量化与非量化策略的性能差异。通过实测数据,详细评估了不同方法在推理速度、CPU占用、内存消耗及模型精度上的表现,并提供了从模型结构调整到系统级优化的具体建议,为边缘AI部署选型提供实用参考。

weixin_29099217的博客 529

clock-gating整理

文章目录clock gating 理解1、latch双稳态器件常见锁存器结构SR锁存器D锁存器2、clock gating(clock low-active) latch + AND gating 电路(clock high-active)latch + OR gating 电路 clock gating 理解 1、latch 参考:https://www.cnblogs.com/IClearner/p/6443539.html 双稳态器件 稳定状态为0或1两种 举例:交叉耦合反相器 假设初始Q为1,则可

d_b_的博客 1万+

JVM系列之内存与垃圾回收篇

JVM系列之内存与垃圾回收篇       今天听同事说,当996成为常态,没有一个程序员是无辜的 话说,咱们程序员总是有一颗想要学习的心,套用网上的一句话就是:一天不学习,浑身难受啊!!! 文章目录JVM系列之内存与垃圾回收篇前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机

JSDSFY的博客 2841

深入解析摄像头硬件接口:DVP、MIPI-CSI2与USB的技术对比与应用场景

本文深入解析了摄像头三大主流硬件接口DVP、MIPI-CSI2与USB的核心技术差异。DVP接口作为并行传输的“老兵”,成本低但带宽和抗干扰能力有限;MIPI-CSI2凭借差分串行设计成为移动高清设备的首选,具备高带宽和强抗干扰性;USB接口则依托UVC标准实现了跨平台的即插即用。文章通过对比传输方式、带宽、应用场景等关键维度,为智能硬件、嵌入式系统等领域的工程师提供了清晰的选择指南。

c7d8e的博客 515

01-JVM内存与垃圾回收篇概述_尚硅谷JVM学习笔记

对已有占用的空间的数据进行一个回收,那在这部分当中,我们比较重点关注的一个就是如何来判断它是一个垃圾,这就涉及到相关的算法问题。那通常的话,像书里边会包含这个第一个篇章和第二个篇章的内容。那如果你买相关的书的话,一般都会涉及到具体的这里边的某些方面,像内存与垃圾回收,这应该算是比较基本的这个内容了。,就是在八的环境下,我们来跑绝大部分的程序,那后边的话在九、十、十一、十二乃至于十三当中关于一些新的特性,在。像解释器,其实编译器,对吧,包括我们说的垃圾回收,这个垃圾回收器都是在我们的执行引擎这个结构当中的。

weixin_49211183的博客 913

FPGA工程师面试——FPGA基础知识24题

线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用OC门(集电极开路与非门)来实现,由于不用OC门可能使灌电流过大,而烧坏逻辑门,因此在输出端口应加一个上拉电阻。

FPGA/MATLAB学习教程/源码/项目合作开发 1086

Flow Match 原理 及应用

Flow Matching(流匹配)是生成模型的范式革命——用确定性ODE替代随机扩散过程,在自动驾驶轨迹预测中实现10倍采样加速和更高生成质量。更快的采样速度:通常只需 10-50 步就能生成高质量样本更稳定的训练:避免了传统扩散模型中复杂的噪声调度理论基础:基于连续正规化流(Continuous Normalizing Flows)核心思想:Flow Matching 通过学习一个 向量场(vector field) 来直接建模从噪声分布到目标分布的连续变换路径。

@bangbang的博客 99

内存篇:JVM内存结构

Java8相对之前的版本,JVM结构发生了较大的变化,取消了永久代,新增了元空间,同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。下面,以Java8为例,对JVM结构做一番总结。 JVM内存结构1 JVM结构详解1.1 堆(Heap)1.2 方法区(Method Area)1.3 程序计数器(Program Counter Register)1.4 虚拟机栈(JVM ...

云深不知处 1万+

JVM上篇:内存与垃圾回收篇-笔记

JVM上篇:内存与垃圾回收篇 学习笔记和代码过程加面试题

weixin_43102784的博客 594

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JVM篇:直接内存

直接内存并不是JVM的内存结构,直接内存是操作系统的内存,Java本身并不能对操作系统的内存进行操作,而是通过调用本地方法。直接内存常用于NIO作为缓冲区存在,分配成本较高但是读写性能好,并且不受JVM内存回收管理。

zmbwcx的博客 1908

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!

前言 CPU 是时分的,操作系统里面有很多线程,每个线程的运行时间由CPU决定,CPU会分给每一个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,就是100%,我们应该意识到,CPU运行速度很快(主频非常高),除非是密集型耗费CPU的运算,其他类型的任务都会在小于时间片的时间内结束。 内存过高一般有两种情况:内存溢出和内存泄露 内存溢出: 程序分配的内存超过物理机的内存大小,导致无法继续分配内存,出现OOM报错 内存泄露: 不再使用的对象一直占据着内存不释放,导致这块内存浪费掉,

牧小农 1万+

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

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

JVM 内存模型 —— JVM篇

JVM 内存模型 一、JVM 体系结构 ​ Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。JVM所管理的内存将会包括以下几个运行时数据区域。如下图所示: 运行时数据区也是Java虚拟机的内存结构,如以下图所示: 1.classfile 是字节码文件的部分。 2.classloader 是类加载器。 3.内存结构也就是运行时数据区。

YING—country的博客 2567

JVM篇之内存及GC

HotSpot VM把GC分代收集扩展至方法区, 即使用Java堆的永久代来实现方法区, 这样 HotSpot 的垃圾收集器就可以像管理 Java 堆一样管理这部分内存, 而不必为方法区开发专门的内存管理器(永久代的内存回收的主要目标是针对常量池的回收和类型的卸载, 因此收益一般很小)一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。正在执行 java 方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。

weixin_47138646的博客 1536

JVM内存篇

堆是Java 虚拟机所管理的内存中最大的一块,是线程共享的一块内存区域,在虚拟机启动时创建。多线程是并发的,CPU会不停的轮换线程任务去执行,如果程序计数器是共有的,所有的线程共有一个程序计数器,那么当一个线程切换到另外一个线程之后,在另外一个线程执行时会更新掉程序计数器里该执行到哪一条的执行指令,那么当回到原来的线程的时候就不知道从哪开始执行里,所以最好是每个线程都有自己的程序计数器,这样子就不会出现误差。其中线程共享内存的是堆内存和方法区,栈内存是线程私有的。是线程私有的、其生命周期和线程相同。

qq_39095829的博客 182

JVM篇之内存结构

一些带有 native 关键字的方法就是需要 JAVA 去调用本地的C或者C++方法,因为 JAVA 有时候没法直接和操作系统底层交互,所以需要用到本地方法栈,服务于带 native 关键字的方法。

m0_66689823的博客 771

JVM内存与垃圾回收篇

一,JVM与Java体系结构 1,虚拟机与java虚拟机概述 1)虚拟机 所谓虚拟机就是一台虚拟的计算机。它是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。 Visual Box ,VMware就属于系统虚拟机,他们完全是对物理计算机的仿真,提供了一个可以运行完整操作系统的软件平台。 程序虚拟机的典型代表是Java虚拟机,他专门为了执行单个计算机程序而设计,在java虚拟机中执行的指令我们称为Java字节码指令。 无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限

weixin_45596022的博客 557

【JVM】总结篇-运行时内存篇

而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC 的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出—个。不会随着程序的运行需要更大的空间。

ChanceZhou的博客 979

JVM之内存结构篇

本节将会介绍一下JVM的内存结构,JVM运行时数据区的各个组成部分:堆,方法区,程序计数器,Java虚拟机栈,本地方法栈,还会对Java堆的分代划分做个简单的介绍。

苏渠的博客 2038

JVM内存模型篇【JVM内存模型】

1、JVM内存模型 本地方法区 Java官方对于本地方法的定义为methods written in a language other than the Java programming language,就是使用非Java语言实现的方法,但是通常我们指的一般为C或者C++,因此这个栈也有着C栈这一称号。一个不支持本地方法执行的JVM没有必要实现这个数据区域。本地方法栈基本和JVM栈一样,其大小也是可以设置为固定值或者动态增加,因此也会对应抛出StackOverflowError和OutOfMemor

qq_44182694的博客 1万+

jvm篇 jvm内存结构

JVM 内存结构 Java 虚拟机的内存空间分为 5 个部分: 程序计数器 Java 虚拟机栈 本地方法栈 堆 方法区 JDK 1.8 同 JDK 1.7 比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对 JVM 规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。 程序计数器(PC 寄存器) 程序计数器的定义 程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此

li497575985的博客 152

JVM内存结构,看这篇就够了

JVM JRE JDK java程序在经过javac编译成.class文件后,需要JVM将这些字节码文件放到方法区翻译成机器码让执行引擎来执行,随后JVM调用操作系统函数完成操作。 JVM是一个将class翻译成机器码。在生成机器码的过程中需要依赖很多类库(jar包)。JVM标准加上这些类库就组成了JRE(java runtime environment)。 但是对代码的编译 反编译 调试 打包等等操作就需要用到JDK。 其实JVM是一个虚拟化的操作系统,在理解JVM时将他和Windows或Linux操作系

Alan_97的博客 455
上一篇: UML总结
expectbird
博客等级 码龄19年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值