JVM 尚硅谷-宋红康 笔记
文章平均质量分 51
_zBlog
这个作者很懒,什么都没留下…
展开
-
类的加载过程概述概述
在Java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照Java虚拟机规范,从class文件到加载到内存中的类,到类卸载出内存位置,它的整个生命周期包括如下7个阶段:也就是大致分为加载--链接--初始化--使用--卸载五个阶段,其中链接(Linking)环节还包括验证(Verification)--准备(Preparation)--解析(Resolution)三个重要步骤。从程序中,类的使用过程看:在链接之前会先判断是否加原创 2021-04-16 16:26:58 · 57 阅读 · 0 评论 -
GC日志补充说明
原创 2021-04-16 14:38:45 · 58 阅读 · 0 评论 -
显示GC日志的参数
内存分配与垃圾回收的参数列表:-XX:+PrintGC 输出GC日志。类似:-verbose:gc -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如2013-05-04T21:53:59.234+0800) -XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 -.原创 2021-04-16 14:26:15 · 97 阅读 · 0 评论 -
7款经典垃圾回收器总结
截止JDK1.8,一共有7款不同的垃圾收集器。每一款不同的垃圾收集器都有不同的特点,在具体使用的时候,需要根据具体的情况选用不同的垃圾收集器。垃圾回收器 分类 作用位置 使用算法 特点 使用场景 Serial 串行运行 新生代 复制算法 相应速度优先 适用于单CPU场景下的client模式 ParNew 并行运行 新生代 复制算法 响应速度优先 多CPU场景下Server模式,配合CMS使用 Paral原创 2021-04-16 14:13:28 · 136 阅读 · 0 评论 -
G1垃圾回收的优化建议
G1回收过程:补充从Oracle官方透漏出来的信息可以知道,回收阶段(Evacuation)其实本也有想过设计成与用户程序一起并发执行,但这件事情做起来比较复杂,考虑到G1只是回收一部分Region,停顿时间是用户可控制的,所以并不迫切去实现,而是选择把这个特性放到了G1出现之后的低延迟垃圾收集器(即ZGC)中。另外,还考虑到G1不仅仅是面向低延迟,停顿用户线程能够最大幅度的提高垃圾回收效率,为了保证吞吐量所以才选用了完全暂停用户线程的实现方案。G1优化相关建议:年轻代大小避免使用-Xmn或-原创 2021-04-16 13:51:52 · 170 阅读 · 0 评论 -
G1回收详细过程
G1回收过程1:年轻代GC第一阶段,扫描根:根是只static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连同RSet记录的外部引用作为扫描存活对象的入口。第二阶段,更新Rset:处理dirtycardqueue(下面说明)中的card,更新RSet。此阶段完成后,RSet可以准确的反映老年代对所在的内存分段中对象的引用。第三阶段,处理RSet:识别被老年代对象指向的Eden中的的对象,这些被指向的Eden中的对象被认为是存活的对象。第四阶段,复制对象:此..原创 2021-04-16 13:40:21 · 1263 阅读 · 0 评论 -
G1回收器垃圾回收过程
G1GC的垃圾回收过程主要包括如下三个环节:年轻代GC(YoungGC) 老年代并发标记过程(ConcurrentMarking) 混合回收(MixedGC) 如果需要,单线程、独占式、高强度的FullGC还是继续存在的。它针对GC的评估失败提供了一种失败保护机制,即强力回收。应用程序分配内存,当年轻代的Eden区用尽时开始年轻代回收过程;G1的年轻代收集阶段是一个并行的独占式收集器。在年轻代回收期间,G1GC暂停所有的应用程序线程,启动多线程执行年轻代回收。然后从年轻代区间移动存活...原创 2021-04-15 20:06:26 · 445 阅读 · 0 评论 -
G1的参数设置
-XX:+UseG1GC手动使用G1收集器执行内存回收业务。 -XX:G1HeapRegionSize设置每个Region的大小。值是2的幂,范围是1MB到32MB之间,目标是根据最小的Java堆大小划分出约2048个区域。默认是堆内存的1/2000。 -XX:MaxGCPauseMillis 设置期望达到的最大GC停顿时间指标(JVM会尽力实现,但不能确保达到)。默认值是200ms。 -XX:ParallelGCThread 设置STW工作线程数的值。最多设置8 -XX:ConcGCThr...原创 2021-04-15 19:13:49 · 2659 阅读 · 0 评论 -
G1回收器:区域化分代式
G1垃圾回收器是在Java7update4之后新引入的一个新的垃圾收集器,是当今收集器技术的前沿成果之一。出现是为了适应现在不断扩大的内存和不断增加的处理器数量,从而进一步降低暂停时间(PauseTime),同时兼顾好的吞吐量。官方给G1设定的目标是在延迟可控的情况下尽可能获得高的吞吐量,所以才担当起”全功能收集器“的重任与期望。为什么名字叫GarbageFirst呢?首先,G1是一个并行收集器,它把堆内存分割为很多不同的区域(Region)(物理上是不连续的)。使用不同的Region...原创 2021-04-15 18:32:50 · 112 阅读 · 0 评论 -
Parallel Scavenge收集器:吞吐量优先
ParallelScavenge收集器,是年轻代中除了ParNew以外的另一款垃圾收集器,同样采用了并行回收、复制算法和”StopTheWorld“机制。 那么它和ParNew的区别?和ParNew收集器不同,ParallelScavenge收集器的目标是达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优先的垃圾收集器。自适应调节策略也是ParallelScavenge与ParNew的一个重要区别。高吞吐量可以高效的利用CPU时间,尽快完成程序的运算任务,(意味着暂停时...原创 2021-04-15 15:32:11 · 805 阅读 · 1 评论 -
ParNew垃圾收集器
可以理解为ParNew收集器是Serial收集器的多线程版本。Par是Parallel的缩写,New说明只能处理的是新生代。 ParNew收集器和Serial收集器非常相似,区别只有ParNew采用的是并行垃圾收集。ParNew在新生代中也是采用复制算法、”StoptheWorld“机制。 ParNew是很多JVM运行在Server模式下新生代默认的垃圾收集器。对于新生代,回收次数频繁,使用并行方式高效。对于老年代,回收次数少,使用串行方式节省资源。(CPU并行需要切换线程,串行可以省去切..原创 2021-04-15 14:32:03 · 250 阅读 · 0 评论 -
Serial与Serial Old垃圾回收器
Serial收集器是最基本、历史最悠久的垃圾收集器。JDK1.3之前回收新生代的唯一选择。(2000年5月发布) Serial收集器作为HotSpot中client模式下默认的新生代垃圾收集器。 Serial收集器采用复制算法、串行回收和”Stop-The-World“机制的方式执行内存回收。 除了年轻代外,Serial收集器还提供用于执行老年代垃圾收集的SerialOld收集器。SerialOld收集器同样也采用了串行回收和”Stop-The-World“的机制,只不过内存回收算法是标记-压缩算..原创 2021-04-15 14:07:31 · 328 阅读 · 0 评论 -
System.gc()的理解
在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发FullGC,同时对老年代和新生代回收,尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。 JVM实现者可以通过System.gc()调用来决定JVM的GC行为。而一般情况下垃圾回收应该是自动进行的,无需手动触发,否则就过于麻烦了。在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()。...原创 2021-04-14 16:23:14 · 205 阅读 · 0 评论 -
分区算法的说明
一般来说,在相同条件下,堆空间越大,一次GC所需要的时间也越长,有关GC产生的停顿也越长。为了更好的控制GC产生停顿的时间,将一块大的内存区域分割成多个小块,根据目标的停顿时间,每次合理地回收若干小区间,而不是整个堆空间,从而减少一次GC所停顿的时间。分带算法将按照对象的生命周期划分成两个部分,分区算法将整个堆空间划分成连续的不同小区间。每一个小空间都独立使用,独立回收。这种算法的好处是可以控制一次回收多少个小区间。现在介绍的都是基本的算法思路,GC实现过程要复杂的多,目前还在发展中的前沿G原创 2021-04-14 15:23:19 · 119 阅读 · 0 评论 -
增量收集算法原理及优缺点
上述现有的算法,在垃圾回收过程中,应用软件将处于一种StoptheWorld的状态。在StopTheWorld状态下,应用程序所有的线程都会挂起,暂停一切的正常工作,等待垃圾回收的完成。如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。为了解决这个问题,即对实时垃圾收集算法的研究直接导致了增量收集(IncrementalCollecting)算法的诞生。基本思想:如果一次性将所有垃圾进行处理,需要造成系统长时间的停顿,那么我们可以让垃圾收集线程饿应用线程交替执...原创 2021-04-14 15:13:09 · 429 阅读 · 0 评论 -
分代收集算法
前面这些所有的算法当中,并没有一种算法可以完全代替其他算法,它们都具有各自的优势和特点。分代收集算法应运而生。分代收集算法,是基于这样一个事实:不同对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。一般是把Java堆分为新生代和老年代,这样就可以根据各个年代的特点使用不同的回收算法,以提高垃圾回收的效率。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直原创 2021-04-14 14:57:57 · 218 阅读 · 0 评论 -
不同指标上对比三种算法
效率上,复制算法最快,但消耗了太多内存。(空间换时间的思想)不考虑实际条件约束的情况下,我们希望有一种垃圾回收算法速度最快、空间开销小、回收后内存空间整齐。 Mark-Sweep Mark-Compact Copying 内存是否整齐 否 整齐 整齐 空间开销 小 小 大 速度 中等 慢 快 可以发现复制算法两项指标都很完美,但耗费的额外空间是在太大,只能在在垃圾对象比较多的,存活对象比较少的时候使用。而标记-.原创 2021-04-14 14:35:02 · 496 阅读 · 1 评论 -
标记-压缩算法原理及优缺点
背景:复制算法的高效性是建立在存活对象少,垃圾对象多的前提下的。这种情况在新生代经常发生,但是在老年代,更常见的情况是大部分对象都是存活对象。如果依然使用复制算法,由于存活对象数量较多,复制的成本也很高。因此,基于老年代垃圾回收的特性,需要使用其他垃圾回收算法。标记-清除算法的确可以应用到老年代中,但是该算法不仅执行效率低下,而且在执行完内存回收后还会产生内存碎片,所以JVM的设计者需要在此基础上进行改进。标记-压缩(Mark-Compact)算法由此诞生。1970年前后,G.L.Steele、原创 2021-04-14 14:18:35 · 1234 阅读 · 0 评论 -
复制算法原理及优缺点
背景:为了解决标记-清除算法在垃圾收集效率方面的缺陷,M.L.Minsky于1963年发表了著名的论文,《使用双存储区的Lisp语言垃圾收集器CA LISP Garbage Collector Algorithm Using Serial Secondary Storage》。M.L.Minsky在该论文中描述的算法被人们称为复制(Copying)算法,它也被M.L.Minsky本人成功引入到了Lisp语言的一个实现版本中。核心思想:将活着的内存空间分为两块,每次只使用其中一块,在垃圾回收时将.原创 2021-04-14 13:52:44 · 981 阅读 · 0 评论 -
标记-清除(Mark - Sweep)算法
背景:标记-清除算法(Mark-Sweep)是一种非常基础和常见的垃圾收集算法(人们会产生的常规想法),该算法被J.McCarthy等人在1960年提出并应用于Lisp语言。执行过程:当堆中的有效内存空间(availiablememory)被耗尽的时候,会停止整个程序(也成stoptheworld),然后进行两项工作,第一项是标记,第二项则是清除。标记:Collector从引用根节点开始遍历,标记所有被引用的对象。一般是在对象的Header中记录为可达对象。 清除:Collector...原创 2021-04-14 10:53:23 · 1864 阅读 · 0 评论 -
垃圾标记阶段的算法之可达性分析算法
可达性分析(或跟搜索算法、追踪性垃圾收集)相对于引用计数算法而言,可达性分析算法不仅同样具备实现简单和高效等特点,更重要的是该算法可以有效的解决在引用计数算法中循环引用的问题,防止内存泄露的发生。 相较于引用技术算法,这里的可达性分析就是Java、C#选择的。这种类型的垃圾回收通常也叫做追踪性垃圾收集(TracingGrabageCollection)。所谓”GCRoots“根集合就是一组必须活跃的引用。 基本思路:可达性分析算法是以根节点对象集合(GCRoots)为起始点,按照从上...原创 2021-04-13 19:00:50 · 288 阅读 · 0 评论 -
引用计数法的原理和优缺点
垃圾标记阶段:对象存活判断堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中那些是存活对象,哪些是已经死亡的对象。只有被标记为已经死亡的对象,GC才会在垃圾回收过程时,释放掉其所占用的内存空间,因此我们可以称这个过程为垃圾标记阶段。 那么在JVM中是如何标记一个对象死亡的呢?简单来说,当一个对象已经不再被任何存活的对象引用时,就可以宣判为死亡。 判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数法引用计数法(ReferenceCounting).原创 2021-04-13 15:40:16 · 5654 阅读 · 1 评论 -
java自动内存管理介绍
自动内存管理,无需开发人员手动参与内存的分配和回收,这样降低了内存泄露和内存溢出的风险。 自动内存管理,将开发人员从繁重的内存管理中释放出来,可以更专心地专注于业务开发。自动内存管理引发的忧虑和解决办法:对Java开发人员而言,自动内存管理就像一个黑匣子,如果过度依赖自动,那这可能会是一场灾难,最严重的就是会弱化Java开发人员在程序出现内存溢出时定位问题和解决问题的能力。 那么解决这个问题的方法就是,了解JVM的自动内存分配和内存回收原理。在了解JVM是如何管理内存后,我们才能在遇见OOM时,快原创 2021-04-13 14:56:59 · 118 阅读 · 0 评论 -
早期的垃圾回收行为
在早期的C/C++时代,垃圾回收基本上是手工进行的。开发人员可以使用new关键字进行内存申请,并使用delete关键字进行内存释放。比如以下代码:这种方式可以灵活控制内存释放的时间,但是会给开发人员带来频繁申请和释放内存的管理负担。倘若有一处内存空间由于程序员的编码问题忘记被回收,那么就会产生内存泄露,垃圾对象永远无法被清除,随着系统运行时间的不断增长,垃圾对象所耗的内存可能持续上升,直至出现内存溢出并造成应用程序崩溃。有了垃圾回收机制后,上述代码块极有可能变成这样:现在,除了java以原创 2021-04-13 14:22:06 · 133 阅读 · 1 评论 -
什么是GC,为什么需要GC
什么是垃圾(Garbage)呢?垃圾是指程序运行过程中,没有任何指针指向的对象。 英语:An object is considered garbage when it can no longer be reached from any pointer in the running program.如果不及时对内存中的垃圾进行清理,那么这些对象会占有空间直至程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。什么是GC,为什么需要GC?对于高级语言来说,一个基本的认知是,如果不进行原创 2021-04-13 14:07:14 · 453 阅读 · 0 评论 -
JVM运行时参数
01-JVM参数选项类型类型一:标准参数选项特点:比较稳定,后序版本基本不会变化;以 -开头各种选项:运行java或者java -help可以看到所有的标准选项补充内容:-server与 -clientHotspotJVM有两种模式,分别是server和client,分别通过-server和-client模式设置。1.在32为Windows系统上,默认使用Client类型的JVM。要想使用Server模式,则机器配置至少有2个以上的CPU和2G以上的物理内存。client模式...原创 2021-04-09 19:45:48 · 152 阅读 · 0 评论 -
JVM监控及诊断工具-GUI篇
01-工具概述使用上一章命令行工具或组合能帮助我们获取目标Java应用性能相关的基础信息,但它们存在下列局限:1、无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。2、要求用户登陆到目标Java应用所在的宿主机上,使用起来不是很方便。3、分析数据终端输出,结果展示不够直观。为此,JDK提供了一些内存泄露的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不满足快速定位的需求。所以原创 2021-03-30 18:39:39 · 276 阅读 · 0 评论 -
JVM监控及诊断工具-命令行篇
2.jps(JavaProcessStatus):查看正在运行的Java进程基本情况:显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),用于查询正在运行的虚拟机进程。说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。基本语法:jps [options] [hostid]我们可以通过追加参数,来打印额外的信息。options参数-q:仅仅显示LVMID(localvirtualmachineid),即本地虚拟...原创 2021-03-29 16:26:41 · 140 阅读 · 2 评论