聊一聊 JVM 的 GC】的更多相关文章

原文链接:https://www.changxuan.top/?p=1457 引言 JVM 中的 GC 在技术博客中应该算是个老生常谈的话题,网络上也存在着许多质量参差不齐的文章,可以看出来大都是"复制粘贴"的风格.在写这篇文章的时候,我问了问自己"现在我算不算是在制造数据垃圾?". 我为什么要写呢?其实写这篇博文的主要目的不是给别人看的,而是想要记录一下自己对于 JVM 中 GC 的理解与认识.我认为有一类文章存在的意义主要是用来记录的,记录自己对一个事物认识与思…
JVM的GC概述 GC即垃圾回收,是指jvm用于释放那些不再使用的对象所占用的内存.在充分理解了垃圾收集算法和执行过程后,才能有效的优化它的性能. 有些垃圾收集专用于特殊的应用程序.比如,实时应用程序主要是为了避免垃圾收集中断,而大多数OLTP应用程序则注重整体效率.垃圾收集的目的在于清除不再使用的对象.gc通过确定对象是否被活动对象引用来确定是否收集该对象.两种常用的方法是引用计数和对象引用遍历.引用计数引用计数存储对特定对象的所有引用数,也就是说,当应用程序创建引用以及引用超出范围时,jvm…
Linux使用jstat命令查看jvm的GC情况 http://www.open-open.com/lib/view/open1390916852007.html http://www.aiuxian.com/article/p-2032660.html http://blog.csdn.net/u011202334/article/details/51498108   Options,选项,我们一般使用 -gcutil 查看gc情况 vmid,VM的进程号,即当前运行的java进程号 inte…
poptest老李谈jvm的GC   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200. java虚拟机有四种GC分别是: 第一种为单线程GC,也是默认的GC.,该GC适用于单CPU机器. 第二种为ThroughputGC,是多线程的GC,适用于多CPU,使用大量线程的程序.第二种GC与第一种GC相似,不同在于GC在收集Young区是多线程的…
B. jstack jstack主要用来查看某个Java进程内的线程堆栈信息.语法格式如下: 1 jstack [option] pid 2 jstack [option] executable core 3 jstack [option] [server-id@]remote-hostname-or-ip 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高…
  jvm的GC日志分析 标签: jvm内存javagc 2015-06-22 16:37 1566人阅读 评论(1) 收藏 举报  分类: Java(4)  JVM的GC日志的主要参数包括如下几个: -XX:+PrintGC 输出GC日志 -XX:+PrintGCDetails 输出GC的详细日志 -XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) -XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53…
1.标记清除算法 黑色部分代表可回收对象,灰色部分代表存活对象,绿色部分代表未使用的.最基础的收集算法就是标记清除算法如同他名字一样,算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后同一回收所有被标记的对象,标记的过程就是我们之前讲过的可达性分析算法.当需要回收时,我们把黑色标记的部分进行回收.标记算法优缺点:优点:简单直接易懂缺点:1.空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行过程中需要分配…
在入门学习JVM的过程中,我们需要先了解关于JVM的知识中有哪些关键词或关键术语,今天在看完书后我想记录下来. Xms64mb    虚拟机初始化时设置内存大小为64mb Xmx256mb  设定虚拟机的最大内存大小为256mb,最好不要超过物理内存大小. 内存泄漏(Memory Leak) 当程序申请一块内存地址,而它在没有释放内存的情况下没有引用指向该内存位置,则会发生内存泄漏.即内存空间使用完毕没有进行回收. 强引用(Strong Reference) 在程序当中对象存在一个指向它的引用时…
目录 序 VII前言 IX 第1章 JVM & GC基础知识 11.1 引言 21.2 基本术语 31.2.1 Java相关术语 41.2.2 JVM/GC通用术语 241.2.3 G1涉及术语 561.3 本章小结 62 第2章 JVM & GC深入知识 632.1 Java虚拟机内存模型 642.1.1 程序计数器 652.1.2 虚拟机栈 662.1.3 本地方法栈 722.1.4 Java堆 732.1.5 方法区 792.2 垃圾收集算法 822.2.1 引用计数法 822.2.…
昨天总结了GC之前要做的事情,今天介绍一下主流的GC算法. 先介绍一下几个名词: Stop The World(STW):JVM进行GC的时候总不能一边清理垃圾一边制造垃圾把,那么垃圾鉴定的准确性根本无法得到保证,所以需要将服务全部停掉那么一瞬间: Yong GC.Minor GC:年轻代区域的GC,所有的年轻代GC都会触发STW: Old GC.Major GC:老年代区域的GC,只有串行部分会触发STW: Full GC:主要针对老年代区域而言的串行GC,会触发STW. 首先说一下年龄分代收…
Java较C而言,最大的区别在于内存管理.JVM设有无用内存空间自动回收复用机制,也就是我们所说的GC. 之前说过,栈是为线程.为函数的执行分配内存的地方,用完即“销毁”,这里留待以后做深入探讨:堆是为对象和数组分配内存的地方,有些对象可能会伴随着程序运行的完整生命周期,但大部分对象都是朝生夕死的,如何判断对象是否有必要“占坑”呢?首先我们要来说一下判别方法:Java中对象的活性判别主要有两种,引用计数法和可达性分析法. 引用计数法:为每个对象设立一个计数器,对象每被引用一次,计数器加一,当引用…
上一节:<JVM之GC算法> 知道GC算法的理论基础,我们来看看具体的实现.只有落地的理论,才是真理. 一.JVM垃圾回收器的结构 JVM虚拟机规范对垃圾收集器应该如何实现没有规定,因为没有最好的垃圾收集器,只有最适合的场景. 图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用.虚拟机所处的区域则表示它是属于新生代还是老年代收集器. 7种:serial收集器.parnew收集器.parallel scavenge收集器.serial  old 收集器.pa…
默认情况下,并不是等堆内存耗尽,才会报 OutOfMemoryError,而是如果 JVM 觉得 GC 效率不高,也会报这个错误. 那么怎么评价 GC 效率不高呢?来看下源码: 呢?来看下源码gcOverheadChecker.cpp: void GCOverheadChecker::check_gc_overhead_limit(GCOverheadTester* time_overhead, GCOverheadTester* space_overhead, bool is_full_gc,…
案例 众所周知,GC主要回收的是堆内存,堆内存中包含年轻代和老年代,年轻代分为Eden和Surivor,如下图所示.我们用案例分析下堆的GC信息[版本:HotSpot JDK1.8]. /** * @author :jiaolian * @date :Created in 2021-03-15 15:02 * @description:新生代内存测试 * @modified By: * 公众号:叫练 */ public class NewGenTest { public static void…
JVM的GC机制 1. 什么对象会被回收 引用计数法:如果一个对象被引用一次,则记录引用次数加一,如果引用取消,则减一,当减到0时,需要被回收. 问题:循环引用,A引用B,B引用A,除此之外,已经无法访问他们. 可达性分析算法:从GC根开始,找到GC根直接或间接引用的对象并标记,没有标记的便是需要回收的. 2. 什么可以作为GC ROOT 虚拟机栈(栈帧中的本地变量表)中引用的对象 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象 方法区中类静态属性引用的对象 方法区中常量引用的…
JVM:GC Roots 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 JVM 垃圾回收的时候如何确定垃圾 什么是垃圾 简单来说就是内存中已经不再被使用的空间就是垃圾 如何判断一个对象是否可以被回收 引用计数法 Java中,引用和对象是有关联的.如果要操作对象则必须用引用进行. 因此,很显然一个简单的办法就是通过引用计数来判断一个对象是否可以回收.简单说,给对象中添加一个引用计数器 每当有一个地方引用它,计数器值加1 每当有一个引用失效,计数器值减1 任何…
  一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部份,能够运行以Java语言写作的软件程序.   Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就…
GC的概念 GC:Garbage Collection 垃圾收集.这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出). 内存区域中的程序计数器.虚拟机栈.本地方法栈这3个区域随着线程而生,线程而灭:栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈的操作,每个栈帧中分配多少内存基本是在类结构确定下来时就已知的.在这几个区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟着回收了.而Jav…
内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要. 1.在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对 象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测.为解决这种矛盾,Sun JVM的内存管理采用分代的策略. 1)年轻代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁.…
一.相关概念  a. 基本回收算法 1. 引用计数(Reference Counting)  比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数.垃圾回收时,只用收集计数为0的对象.此算法最致命的是无法处理循环引用的问题.  2. 标记-清除(Mark-Sweep)  此算法执行分两阶段.第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除.此算法需要暂停整个应用,同时,会产生内存碎片.  3. 复制(Copying)  此算法…
GC优点: 1.提高生产率,不用逐行检查内存是否释放. 2.Java安全策略的一部分,不会使用户错误释放内存而导致JVM崩溃. GC算法基本两点: 1.检测出垃圾对象. 2.回收垃圾对象,释放相应堆空间. 垃圾检测一般是先建立一个根对象集合,其它对象要是从根对象起可触及就是活的,无法到达的就是垃圾,如下图 栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从 Java栈开始.同时,一个栈是与一个线程对应的,因此,如果有多 个线程的话,则必须对这些线程对应的所有的栈进行检查.同时,除了…
一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部份,能够运行以Java语言写作的软件程序.   Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以…
1.为什么要有GC 没有GC的世界,我们需要手动进行内存管理,但是内存管理是纯技术活,又容易出错.但是我们写码的目的是为了解决业务问题,所以可以把这种纯技术活自动化,当然自动化也是有代价的. 2.垃圾定义 把分配到堆中那些不能通过程序引用的对象称为非活动对象,也就是死掉的对象,称为垃圾 3.GC定义 我们想让内存管理变得自动化,就必须实现两件事(1)找到内存里的垃圾 (2)回收垃圾,让这块空间可以重新使用 4.常说的分代垃圾回收 经验:大部分的对象在生成之后马上就变成了垃圾,很有有对象能活的很久…
阿里巴巴突然来了个面试邀请电话,问了些java底层的东西,不知所措,所以专门花了些时间做了下学习,顺便记录下,好记性不如烂笔头. 一.对JAVA的垃圾回收机制(GC)的理解 不同于C/C++需要手工释放对象所占的内存,JAVA全部委托给了GC进行处理,能更有效的防止内存泄漏的情况.一个程序对应着一个JVM,每个JVM会单独有一个堆,java中创建的对象与数组是存放在堆中的,堆中的内存由GC进行管理(栈中存储引用变量.局部变量一级基本数据类型,超出作用域就会立即释放内存). 当一个对象没有再被引用…
1.Java堆中各代分布: 图1:Java堆中各代分布 Young:主要是用来存放新生的对象. Old:主要存放应用程序中生命周期长的内存对象. Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域. 它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出…
我们前面说到了JVM的常用的配置参数,其中就涉及了GC相关的知识,趁热打铁,我们今天就学习下GC的算法有哪些,种类又有哪些,让我们进一步的认识GC这个神奇的东西,帮助我们解决了C 一直挺头疼的内存回收问题. 一.GC的概念 首先在介绍GC概念之前,我们先知道下为什么GC,然后我们再讲解GC.众所周知,JAVA 语言,与C语言不同,Java内存(堆内存)的分配与回收由JVM垃圾收集器自动完成,比如 C语言自己定义的变量,不用时需要自己回收这个变量 .JAVA这就是自动完成了,自动检测,无用的垃圾,…
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量.命令的格式如下: jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]  注意!!!:使用的jdk版本是jdk8. 类加载统计: Loaded:加载class的数量 Bytes:所占用空间大小 Unloaded:未加载数量 Bytes:未加载占用空间 Time:时间 编译统计 Compiled:编译数量. Failed:失败数量 Invalid:不可用数量 Time:时间 FailedType:失败类型 Fail…
JVM对ElasticSearch集群的稳定性有很大的影响. Java是一个垃圾收集语言,意思是这个程序不会手动管理分配和释放内存.程序员只需要编写代码,jvm管理根据需要管理分配内存的处理,然后在不需要的时候清理. ------------ Young (or Eden) 当新实例一个对象的时候分配的空间,新生代的空间一般比较小,通常是100MB-500MB,新生代也包含了2个幸存(survivor)空间. Old 存储较老的对象空间.这些对象预期是长久的并且持续了很长时间.老年代一般比新生代…
JVM运行期间 线程共享 线程私有 线程共享: 方法区 堆方法区:存放可以共享数据,静态常量,类的共有方法属性字段等,可以共享的存在方法区. 堆:存放class对象 . 线程私有:本地方法栈 虚拟机栈 程序计数器 本地方法栈:存储有关键字native的对象 虚拟机栈:存储引用对象 程序计数器:假如两个线程从0执行到100,先是线程A抢到了cpu资源,他从0执行到了15,cpu重新分配资源,线程B抢到了从0执行到了10,下一次资源线程A抢到他从15执行到了20.那这个线程是怎么延续上一次的操作继续…
原创不易,如需转载,请注明出处https://www.cnblogs.com/baixianlong/p/10697554.html ,多多支持哈! 一.什么是GC? GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法.Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理.要请求垃圾收集,可以调用…