深入理解JVM读书笔记——自适应内存管理(一)

Packtpub.Oracle.JRockit.The.Definitive.Guide.Jun.2010.rar 立即下载

笔记书籍:JRockit权威指南深入理解JVM

作者:马库斯.希尔特 马库斯.拉杰格伦 著
翻译:曹旭东

3.1自动内存管理

自动内存管理(automatic memory management)是指无须使用老式的内存释放操作,例如free操作符 ,就可以自动回收废弃对象占用的内存的垃圾回收技术。
大部分自动内存管理系统使用的都是引用跟踪技术,即执行垃圾回收时沿着对象的引用关系遍历堆中对象,以确定哪些需要回收,哪些需要保留。

堆:特指在使用垃圾回收的环境中,所有用于存储对象的、非线程局部的内存空间(non-thread local memory)。

3.1.1自适应内存管理

自适应内存管理(adaptive memory menagement)是指主要通过运行时反馈来调整内存管理系统的行为。

出于性能考虑,自适应内存管理必须要正确利用运行时反馈,这其中包括修正垃圾回收策略,自动缩放堆大小,以适当的时间间隔整理内存碎片,以及判断何时 stop the world(STW)等。STW是指暂停正在执行的Java应用程序,转而执行垃圾回收的某些操作。

3.1.2自动内存管理的优点

1 加快软件开发速度
2 自动内存管理解决了内存分配问题
3 自适应内存管理可以根据应用程序的具体运行状态,适时地修正垃圾回收策略,例如改变执行垃圾回收任务的线程数量或其他与垃圾回收相关的参数。

3.1.3自动内存管理的缺点

1 降低应用程序的执行效率
2 影响垃圾回收器工作时间长短的主要因素是堆中存活对象(live object)的总数量,而不是堆的大小
3 使用垃圾回收机制仍然可能存在内存泄漏,如果应用程序错误地保存了很多本应被回收掉的对象的引用,这些对象被认定为存活对象。

3.2堆管理基础

3.2.1对象的分配与释放

一般来说,为对象分配内存时,并不会直接在堆上划分内存,而是先在线程局部缓冲(thread local buffer)或其他类似的结构中找地方放置对象,然后随着应用程序的运行,新对象的不断分配,垃圾回收逐次执行,这些对象有可能被提到堆中,或被垃圾回收释放。

内存管理系统为了给对象找到合适的位置,使用空闲列表((free list)——串联起内存中可用内存块的链表)来管理内存中的可用空闲区域,并按照某个维度的优先级排序。

3.2.2碎片与整理

碎片化:当死对象被垃圾回收器清除后,就会在堆中留下一个个的孔洞。
当死对象被清除后,所释放的内存空间则为孔洞,若孔洞不足以存放新的对象(内存分配不足)则抛出OutOfMemoryError错误,就会 采取一系列补救措施,这个过程就为整理(compaction)

注意:整理是一个STW操作。执行整理操作时,会遍历对象的引用关系图,并假设互相引用的对象很有可能会被依次访问到,
所以垃圾回收器会尽量将有引用关系的对象紧挨着放在一起 ,这样做是为了可以更好地利用缓存。同时,如果对象的生命
周期差不多的话,都可以在垃圾回收后得到更大的连续空间。

各种垃圾回收算法可以不同程度上抑制内存碎片化的进程(例如使用分代垃圾回收),或者实现自动整理(例如暂停并复制)

3.3垃圾回收算法

在这里分为两种类型:
引用计数垃圾回收:记录某个时刻有多少存货对象引用了某个指定对象。当某个对象引用计数降为0时,即没有存活对象,则将被回收。
引用跟踪垃圾回收:当执行垃圾回收时,为存货对象建立一个引用关系图,并回收掉那些不可达对象。

3.3.1引用跟踪

引用跟踪垃圾回收的概念
1 将应用程序中所有可见对象标记为存活,然后递归标记可以通过存活对象访问的对象。
根集合
专指上述搜索算法的初始输入集合,即开始执行引用跟踪时的存活对象集合。一般情况下,根
集合中包括了因为执行垃圾回收而暂停的应用程序的当前栈帧中所有的对象,包含了可以从当
前线程上下文的用户栈和寄存器中能得到的所有信息。此外,根集合中还包含全局数据,例如
类的静态属性。简单来说就是,根集合中包含了所有无须跟踪引用就可以得到的对象。

1标记-清理
标记
将根集合中的一个对象添加到队列中
遍历队列中的对象,对每个对象X:
将X标记为可达的
将X标记的引用 添加到队列中
清理
遍历堆中每个对象X:
如果X没有被标记为可达的,则将其回收

执行标记操作之前,首先要遍历存活对象图(live object graph),然后遍历所有堆中对象,识别未标记对象(实际操作并非如此,已经有改进加速了这个过程,并尽量使之可以并行)

简单实现标记-清理算法时,对于每个可达对象,一般都会使用一个标记位(mark bit)来表示该对象是否已经被标记过。为对象分配内存时,为了满足对齐要求,其起始地址一般都是偶数,因此,对象 指针的最低位总是0,正适合用来做标记位。
标记-清理算法的一个变种是可以并行运行的三色标记-清理(tri-coloring mark and sweep)。
设置三个变量值分别代表白色,黑色,灰色。白色标记为死对象,将会被回收;黑色标记为未标记为白色标记的对象;灰色对象为存货对象,但其指向对象状态未知。
在标记开始时,所有根集合标记为灰色对象,其他对象标记为白色。
三色标记算法的伪代码实现如下:
标记
默认将所有对象标记为白色
将根集合中的对象标记为灰色
if 灰色对象 exists:
for x in 灰色对象 :
for y in (x引用 的白色对象):将y标记为灰色
if x 所引有的引用都指向了另一个灰色对象:
将x标记为黑色
清理
回收所有白色对象

2暂停-复制

暂停-复制是一种特殊的引用跟踪垃圾回收技术。(不实用)
将堆划分成两个同样大小的分区, 应用程序使用其中一个分区运行,在运行期间 将存活对象复制到另一个空白分区,等到死对象被回收后将空白分区中的存活对象移动回运行分区。所以不仅仅内存只能运行一半,而且频繁的暂停复制影响内存空间和应用程序性能。

3.3.3 STW详解

STW(stop-the-world),为便于执行垃圾回收而暂停所有应用程序的所有Java线程。

1保守式与准确式
虚拟机需要一些 额外的信息记录栈帧中对象的存储位置,这样才能在执行垃圾回收时正确构建根集合的初始值,此外,如果某个线程因垃圾回收停止,也应明确该线程当前的上下文。

在为对象分配内存空间时,垃圾回收器会记录相关信息。
查找某个线程暂停时的上下文信息需要使用检索表(lookup table)和搜索树(search tree)来查找当前指令寄存器的指令时属于哪个java方法的即可。

java使用的是准确式垃圾回收器(exact garbage collector),可以将对象指针类型数据和其他类型的数据区分开,只需要将元数据信息告知垃圾回收器即可,这些元数据信息,一般可以从java方法的代码中得到。

(一刷只是做了解,不深入笔记)

3.3.4分代垃圾回收

将堆划分为两个或多个称为代的空间,并分别存放具有不同长度生命周期的对象,可以提升垃圾回收的执行效率。
在JRockit中,新创建(young)的对象存放在称为新生代(nursry)的空间中,它的内存大小比老年代小很多。
随着垃圾回收的重复执行,生命周期较长的对象会被提升(promote)到老年代。

1 多个新生代的内存排布
一般情况下只有一个新生代,而在某些情况下则为多个小的新生代分级存储不同年龄的对象以根据对象存活次数减少老年代中的对象数量。
2 写屏障
在分代式垃圾回收中,执行垃圾回收时,可能存在引用双方不在一个代中。因此,如果在执行垃圾回收时将所有这样的引用关系都更新一遍 ,这种操作带来的性能损耗就完全抵消了分代式垃圾回收带来的性能提升。
由于分代式垃圾回收的关键点就是将堆划分为不同的内存空间,并分别处理其中的对象。因此,需要代码生成器提供一些辅助信息来帮助完成垃圾回收。
在 实现分代式垃圾回收时,大部分JVM都是用名为写屏障(write barrier)的技术来记录执行垃圾回收时需要遍历堆的哪些部分。当对象A指向对象B时,即对象B成为对象A的属性的值时,就会触发写屏障,在完成属性域赋值后执行一些辅助操作。
写屏障的传统实现方式为将堆划分为多个小的连续空间(例如每块512字节),每块空间称为卡片,于是,堆被映射为一个粗粒度的卡麦(card table)。当Java应用程序将某个对象赋值给对象引用时,会通过写屏障设置脏标志位 (dirty bit),将该对象所在的卡片标记为脏。
这样遍历从老年代指向新生代的引用时间得以缩短,垃圾回收器在做新生代垃圾回收时,只需要检查老年代中被标记为脏的卡牌所对应的的内存区域即可。

3.3.5吞吐量与延迟

优化应用程序运行时间,缩短垃圾回收所花费的时间是必要的方案。但因垃圾回收是STW式的,会在某个节点停止应用程序线程,但如果并发执行则会记录额外的信息,从而延长垃圾回收时间。并且,对于大多数应用程序来说,低延迟是很重要的。而导致高延迟的一个原因就是CPU将部分时间放在了非应用程序线程上。
因此,在内存管理中需要权衡的就是最大化吞吐量和保持低延迟。
1 优化吞吐量
在不需要考虑延迟的问题下,当应用程序允许暂停时间长达数秒的话,那么就可以尽全力优化以达到最大化吞吐量的目标。
并行垃圾回收方式就是以最大吞吐量为目标,在不同的垃圾回收线程之间做一些同步处理,以避免不同区域中有引用关系存在时可能会出现的种种问题。
2 优化延迟
低延迟优化基本的重点是避免STW式的操作,尽可能让应用程序线程多工作。但是,如果垃圾回收期得到的CPU资源过少 ,无法跟上内存分配的速度,则堆内存溢出,抛出outofmemoryError错误。因此,理想的垃圾回收器应伴随着应用程序的运行完成大部分垃圾回收工作。
此种方式称为并发垃圾回收(concurrent garbage collection),

标记-清理垃圾回收算法:标记是采用并行实现,执行时间最长,大约占垃圾回收时间的90%。
近并发垃圾回收:主旨是在应用线程执行的时候 ,尽快多的完成垃圾回收工作。整个垃圾回收周期包含了几个较短的STW操作环节、需要同步修改对象关系图。

3.36JRockit中的垃圾回收

JRockit中垃圾回收算法的基础是三色标记清理算法,并加入了改进优化以提升并行性,优化了垃圾回收的线程数,兵使其可以与应用程序线程并发运行。
根据优化目标不同,JRockit中的垃圾回收可以分代执行,也可以不分代执行。
1 老年代垃圾回收
在实际实现中,使用则是双色标记算法(使用灰色标记存活对象)。区别在于,JRockit中的存活对象会被放入到垃圾回收线程的线程局部队列(thread local queue)。好处有两点:
——1 并行运行的垃圾回收线程可以使用各自的线程局部数据,而不同步操作数据,
——2 可以使用预抓取(prefetch)方式,按照先入先出的顺序来访问队列中的元素,这样可以提升整体性能。
此外,使用存活标记位(live bit)来标记系统中存活对象,可以快速找出应用程序在并发标记阶段新创建了哪些对象。
为了避免搜索整个存活对象图,JRockit不仅将卡麦用于分代垃圾回收,也用在并发标记后的清理工作。可以根据卡片的状态:脏/干净 在并发标记阶段结束后,只要检查卡麦中对应的卡片状态即可 。
当有新对象创建或者对象引用关系修改了的卡片会被标记为脏。
2 新生代垃圾回收
JRockit在新生代中使用了暂停-复制算法的变种,大致过程是暂停应用程序线程,复制存活对象到堆中的另一个区域或提升到老年代。
最开始新生代是空的,通过写屏障在所偶对象更新引用时将对应的卡片设置为脏,所以查找新生代存活对象时,只要扫描卡麦中脏卡片中含有存活标记位的对象即可。
老年代垃圾回收时需知晓哪些卡片在并发标记阶段被标记为脏即可,因此使用一个额外的卡片记录原始卡表中有哪些卡片被标记为脏,这些改变的卡片集合为修改集(modified union set)

保留区:新生代中的一块内存,用于存储在新生代垃圾回收之后没有被复制到老年代的对象。通过将新创建对象存储在保留区中,使新创建对象在被复制到 老年代之前被 回收掉。
3 永生代垃圾回收
存储一些元数据,例如类对象等。处于永生代的对象不会被回收掉
JRockit中没有永生代,在HotSpot中存在。
JRockit将一些元数据信息存储在堆外的本地内存中,对无用的元数据信息,会持续不断的被垃圾回收器清理。
另外,JRockit总是默认对无用元数据进行清理,而且 存储元数据的空间采用了动态分配内存的策略。
4 内存整理
JRockit采用单线程、非并发执行内存整理工作,对于并行垃圾回收器来说,内存整理是在清理阶段进行的。

从NASA DataPort下载到PyTorch Dataset:手把手处理USGS光谱库的AVIRIS数据 本文详细介绍了如何从NASA DataPort下载USGS光谱库的AVIRIS高光谱数据,并将其转化为PyTorch Dataset对象。内容涵盖数据获取、预处理、辐射定标及高效数据加载技巧,特别针对AVIRIS数据的水吸收波段剔除和波段分组标准化进行了重点讲解,为环境监测、地质勘探等领域的研究者提供实用指南。 阅读详情

相关推荐

详细介绍pytorch重要的API

Tensor 是 PyTorch 中最基本的数据结构,提供了多种创建和操作张量的函数。Autograd 提供了自动求导功能,可以跟踪 Tensor 上的操作并计算梯度。损失函数用于衡量模型预测值与真实值之间的差异,提供了多种损失函数。是构建神经网络的基础类,提供了定义网络层和前向传播的方法。提供了 GPU 计算的支持,包括设备管理、内存管理等。提供了一些常用的函数式操作,如激活函数、损失函数等。提供了常用的数据集、模型架构和图像转换工具。提供了数据加载和预处理的工具,包括。

hello! 1223

linux jrockit,用JRockit来检测内存泄露

提出问题对于系统的活跃度比较高,承受的访问压力也很大的系统会出现比较严重的问题,可能一个是内存占用高,一个是还有一些未知bug。由于这些问题而想到我们这两个系统是否有内存泄露?是否可以用某种方法来检测内存泄露?当然经过google后,答案是肯定的。所以我们用测试环境来做一个实验,来验证检测方法的可行性。下面就是详细的整个过程。解决问题一些概念1、什么是JRockit?Oracle JRockit ...

weixin_42602726的博客 425

MATLAB下pdf文件操作读取示例

当遇到一些需要大量数据的项目,数据的读取与储存显得尤为重要。怎样把数据从其他格式的文件中读取,并运用到程序中是很多时候我们要解决的问题。对于平常的.txt,和.xlsx文件,MATLAB有对应的函数帮助读取,但是遇到pdf文件时MATLAB很难读取内容。本文以一个操作实例提供了一个从pdf文件中读取数据的方法。

UESTC 五高考3模拟的博客 6558

JRockit的使用

一.JRockit调优简介 JRockit是一个自适应的JVM,它能够自动调整自己去适应底层硬件,因此对它的调优主要集中在一些需要人工干预的参数上,比如说:需要划分多少 RAM给JRockit使用等。JRockit有一组非标准的-X启动选项,我们可以用它来调节JVM。JRockit有两组主要的子系统可以被优化-- 内存管理系统(包括垃圾回收)和线程系统。在内存管理子系统方面,有很多调优的工作可以做

小鱼的最爱 2989

SVA学习笔记(1)——property基本语法及巧用define与property

巧用define与property,让代码更加灵活

craftsman2018ship的博客 1574

一键转换B站M4S缓存为MP4:无需FFMPEG命令的简易工具

本文介绍了一款专为B站用户设计的绿色工具,可将缓存的M4S视频和音频文件一键转换为通用MP4格式。该工具完全图形化操作,无需学习复杂的FFmpeg命令,解决了普通用户处理B站缓存视频的痛点。文章详细讲解了从下载、配置到转换的完整流程,并提供了常见问题排查与安全使用建议,帮助用户高效、安全地管理离线视频内容。

joy55的博客 480

JVM学习记录一——Java和Java虚拟机

Java和Java虚拟机Java——跨平台的语言Java虚拟机——跨语言的平台(执行Java字节码)常见的Java虚拟机Java虚拟机的特点JVM的整体结构(HotSpot虚拟机)JVM的生命周期Java虚拟机的发展历程JVM的内存结构 跟随宋红康老师学习JVM的学习笔记 Java——跨平台的语言 .java文件通过编译生成字节码(.class)文件 Java虚拟机——跨语言的平台(执行Java字节码) 不同的高级语言通过各自的编译器编译所生成的字节码文件只要符合Java虚拟机的规范即可运行。 操

阿斯加德潘大锤的博客 532

uniapp - 实现苹果App打包上架App Store应用商店详细教程,详解Hbuilder打包编译ipa发布上传到苹果ios软件商店全流程,提供云打包/离线本地打包ios、申请IOS苹果证书方法

uni-app,苹果ios,苹果app,打包编译,appstore应用商店,ipa发布到软件商店,uniapp的app苹果应用商店上架,上架苹果APPStore,uniApp打包的ipa文件上传到商店,上架苹果商城,审核失败,被拒绝,UniApp打包ipa文件,上架iOSAppStore流程指南,最新详细教程最全,Hbuilder打包发布iosapp,苹果云打包上线全过程,云打包IPA并上传到商店,打包iOSipa文件后怎么发布到应用商店,苹果证书申请教程,ios证书申请,mac电脑,审核很久

🏆 前端领域优质创作者 1万+

JRockit

使用JRockit作为工具检测并解决JAVA内存泄漏问题 1      JRockit简介 Jrockit是oracle开发的符合JAVA虚拟机规范的虚拟机+虚拟机监控软件。 虚拟机:Jrockit Real Time 监控软件:Jrockit Mission Control Jrockit Real Time与SUN的JDK是完全兼容的,也就是说以前在SUN的虚拟机上跑的程序,在Jro

xiaomin881122的专栏 3436

AUTOSAR从入门到精通-汽车电子电气架构(EEA)

EEA(Electrical/Electronic Architecture),电子电气架构,是首先由德尔福公司提出的,集合汽车的电子电气系统原理设计、中央电器盒的设计、连接器的设计、电子电气分配系统等设计为一体的整车电子电气解决方案的概念。通过EEA的设计,可将动力总成、驱动信息、娱乐信息等车身信息转化为实际的电源分配的物理布局、信号网络、数据网络、诊断、容错、能量管理等的电子电气解决方案。

getusushu的博客 858

YOLO11的持续学习:如何在不遗忘旧数据的情况下学习新类别

类增量学习(Class-Incremental Learning, CIL)是持续学习(Continual Learning)的一个重要分支,它指的是模型在不遗忘已学旧类别知识的前提下,逐步学习新类别的能力。与传统机器学习假设所有数据一次可用不同,类增量学习更贴近现实世界应用场景——新的类别数据往往会随着时间推移逐步出现。 举个例子,假设我们已经训练好一个YOLOv11模型用于检测"猫"和"狗"两种动物,现在需要让模型新增识别"兔子"的能力。传统方法需要收集所有类别(猫、狗、兔子)的数据重新训练,而类增量

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1966

JVM8自适应导致内存居高不下

YOUNG GC jvm年轻代分为eden区和survivor区,对象被创建后首先在eden区,如果一次young gc没有将其回收的话,会到survivor区。从survivor区到old generation需要了解下动态年龄判断 动态年龄判断: 1.对象超过15次没有被回收,可以通过MaxTenuringThreshold设置 ...

weixin_30733003的博客 538

UFS总体介绍及FPGA开发

通过实现UFS的主控制器、设备控制器等组件,我们可以在FPGA上进行UFS开发,并实现高速数据传输和低功耗特性的存储解决方案。物理层负责传输物理信号,数据链路层提供数据包的传输和错误检测功能,传输层处理数据包的分段、重组和重传,逻辑层管理设备和主控制器之间的命令和数据传输,文件系统层负责文件管理和数据存储。在本文中,我们将介绍UFS的总体架构和特性,并探讨如何在FPGA上进行UFS开发。这些组件的实现涉及到UFS协议的具体细节和硬件平台的特性,因此需要参考UFS协议规范和FPGA开发平台的相关文档。

PodProgram的博客 2136

深入理解JVM读书笔记——自适应内存管理(二)

笔记书籍:JRockit权威指南深入理解JVM 作者:马库斯.希尔特 马库斯.拉杰格伦 著 翻译:曹旭东 3.4性能与伸缩 3.4.1线程局部分配 为分配对象而保留的区域被称为线程局部缓冲区(thread local area,TLA),每一个线程都有一个线程局部缓冲区。 正常情况下,在线程内的缓冲区中为对象分配内存要比直接 在需要同步操作的堆上分配内存快得多。 一般情况下,为了更好地利用缓存,达...

JavaKobeBryant的技术交流 740

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

读书笔记——深入理解JVM(JVM自动内存管理)

简介 本系列为《深入理解Java虚拟机—JVM高级特性与最佳实践》一书的阅读笔记。 本书开头介绍了JVM发展的历史,接着介绍了JVM是如何实现自动内存管理的。 本章节主要介绍: JVM的存储结构; JVM的运行机制; GC 的原理。 1. JVM内存结构和内存溢出异常 JVM实质上就在内存中开辟的一块内存空间,这块空间被JVM占用并被划分成若干个分区(逻辑上的),为了高效的管理,这些分区会执行不同的功能,由于JVM有GC机制,所以我们不用太过于纠结内存泄露的问题,然而当出现内存不足等问题时,我们需要分析

yindarui 551

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

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

深入理解 Jvm 读书笔记(一)

Jvm 内存管理,GC,类文件架构 关键字: HotSpot VM,两级即时编译器, 编译器和解释器混合工作模式,模块化, 混合语言,多核并行``函数式编程, 自动内存管理 jvm 运行时数据区 (JVM栈,本地方法栈,程序计数器,堆,方法区) 线程私有 Jvm栈 (JVM Stack) 生命周期与线程相同; 描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧...

MrJarvisDong的博客 390

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

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

【亲测免费】 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记推荐

深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记推荐 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记》是一个开源项目,旨在为Java开发者、系统架构师以及对JVM有深入研究兴趣的读者提供一份详尽的读书笔记。这份笔记基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》一书...

gitblog_06510的博客 475

深入理解JVM 读书笔记

xx

onlyForCloud的专栏 496

《深入理解Java虚拟机》第三版读书笔记(一)

了解Java虚拟机的运作虽然不是普通开发人员必备的,但是,如果开发人员不了解虚拟机诸多技术特性的运行原理,就无法写出最适合虚拟机运行和自优化的代码。 学习虚拟机中各种自动运作特性的原理是程序员成长之路上最终会接触到的一课。

NewReErWen的博客 2463

《深入理解JVM虚拟机》读书笔记

1、内存区域的划分 内存管理区域大致分为:栈,堆,方法区 栈:都是线程私有。分为程序计数器、虚拟机栈和本地方法栈。 程序计数器记录线程运行的指针信息;虚拟机栈存储基本数据类型、局部变量、对象引用地址、方法出口等信息; 堆:存放对象实例,基本所有对象都在堆上分配内存,是垃圾收集器主要的管理区域。通过-Xmx和-Xms控制 方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 2、对象的创建过程 1、在常量池中定位,检查是否已经被加载、解析和初始化过。 2、如果没有,虚拟机分配

wuzhiheng_的博客 246

《深入理解Java虚拟机》的思维导图读书笔记

《深入理解Java虚拟机》的思维导图读书笔记 作者:被称为L的男人 原文链接:http://www.jianshu.com/p/ff4a1795e462 本文为转载文章,原文请点击左下角查看,谢谢。   说明 本篇文章是对周志明的《深入理解Java虚拟机》的读书笔记,思维导图使用Mindjet MindManager。曾经看到过这样一

huangshulang1234的博客 1874

《深入理解java虚拟机》读书笔记(1)- JVM内存基本结构

文章目录前言一、JVM运行时内存区域二、java对象在内存中是怎样存在的1. 对象的创建1.1 对象创建方式1.2 考虑多线程的情况2. 对象的内存布局3. 怎么找到内存中的对象总结 前言 面向的读者: 有一定java基础 想系统学习JVM基础知识 一、JVM运行时内存区域 需要注意的是,JVM划分了很多内存区域,这些区域都是逻辑上的。其实在物理上,他们可以是同一块区域或者不块区域。这里,我们只讨论逻辑区域。 程序计数器(program counter register): 由JVM 控制,没有定义O

masternick的专栏 208

深入理解Java虚拟机读书笔记(一)

深入理解Java虚拟机读书笔记(一) 文章目录深入理解Java虚拟机读书笔记(一)Java技术体系Java内存管理垃圾收集 注:本文多数内容摘抄自《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)周志明》 Java技术体系 Java程序设计语言、Java虚拟机、Java类库这三部分统称为JDK(Java Development Kit) 把Java类库API中的Java SE API子集...

yiqzq的博客 351

【读书笔记】深入理解Java虚拟机(周志明)(1)第一部分 走进Java(2)第二部分 自动内存管理机制

无重点学习Java虚拟机的重要原因:当出现内存泄漏时,知道怎么排查。学习垃圾收集(Garbage Collection, GC)的原因:可以帮助我们避免和解决OOM问题、由JVM引起的性能瓶颈等:调整Eden区和Survivor区的比值。默认为8:1:1。例如:我们经常要产生临时大对象时,可以将:直接晋级到老年代对象的大小。:设置CMS收集器GC时给用户留多少%的空间无重点无重点。

iioSnail的博客 1728

深入理解JVM--读书笔记

一次线上项目OOM,在网上查询很多内容解决之后,无意之中也接触了一些JVM底层的概念,觉得很有趣,就买了这本书。工作之余看了看,简单写了点笔记。部分章节后续有时间会再细看,再补充笔记 1. Java内存区域与内存溢出异常 内存模型 包含了堆,栈,本地方法栈,虚拟机栈与程序计数器,其中方法区与栈线程共享 程序计数器 Program Counter Register,空间较小,可以看作是当前线程执行的字节码行号指示器。 如果线程执行的是Java方法,则计数器记录的是正在执行的虚拟机字节码的指令地址,如果执行.

哗啦啦啦的博客 319

深入理解Java虚拟机(Java高阶读书笔记)

文章目录深入理解Java虚拟机 - JVM高级特性与最佳实践(周志明)第2版第2章 Java内存区域与内存溢出异常2.1 概述2.2 运行时数据区域2.2.1 程序计数器2.2.2 Java虚拟机栈2.2.3 本地方法栈2.2.4 Java堆2.2.5 方法区2.2.6 运行时常亮池2.2.7 直接内存 深入理解Java虚拟机 - JVM高级特性与最佳实践(周志明)第2版 只要看:第2章、第3章...

GatesMa's blog 2691
上一篇: 深入理解JVM读书笔记——自适应代码生成
下一篇: 深入理解JVM读书笔记——自适应内存管理(二)
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值