jvm调优

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗

我们两清 提交于 2020-02-08 16:14:59
  相信和小编一样的程序猿们在日常工作或面试当中经常会遇到JVM的垃圾回收问题,有没有在夜深人静的时候详细捋一捋JVM垃圾回收机制中的知识点呢?没时间捋也没关系,因为小编接下来会给你捋一捋。 一、 技术背景你要了解吧 二、 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Java中的引用你了解多少 2.4 对象死亡(被回收)前的最后一次挣扎 2.5 方法区如何判断是否需要回收 三、常用的垃圾收集算法 3.1 标记-清除算法 3.2 复制算法 3.3 标记-整理算法 3.4 分代收集算法 3.4.1 年轻代(Young Generation)的回收算法 3.4.2 年老代(Old Generation)的回收算法 3.4.3 持久代(Permanent Generation)的回收算法 四、常见的垃圾收集器 五、GC是什么时候触发的(面试最常见的问题之一) 5.1 Scavenge GC 5.2 Full GC 结束语 一、 技术背景你要了解吧   按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术

JVM调优之---一次GC调优实战

泄露秘密 提交于 2020-02-01 03:11:48
某系统反馈『性能抖动,响应时间会突然飙高,TP999 MAX会到3000+』,初步怀疑是JVM FULL GC导致的 STW,观察FULL GC日志默认的JVM参数: -Xms4096m -Xmx4096m -XX:PermSize=512M -XX:MaxPermSize=512M -XX:ReservedCodeCacheSize=1024M -XX:+UseCodeCacheFlushing 从线上down下来的GC LOG如下: 1768.617: [GC [PSYoungGen: 1313280K->31072K(1341440K)] 3990240K->2729238K(4137984K), 0.0992420 secs] [Times: user=0.36 sys=0.01, real=0.10 secs] 1770.525: [GC [PSYoungGen: 1316704K->27632K(1345536K)] 4014870K->2750306K(4142080K), 0.0552640 secs] [Times: user=0.20 sys=0.00, real=0.06 secs] 1772.437: [GC [PSYoungGen: 1319408K->51424K(1343488K)] 4042082K->2795338K(4140032K), 0

JVM探秘:垃圾收集器

别等时光非礼了梦想. 提交于 2020-01-28 17:03:04
本系列笔记主要基于《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》,是这本书的读书笔记。 垃圾收集器 搜小说 https://shupu.org/ 垃圾收集算法是是内存回收的方法论,垃圾收集器是内存回收的具体实现。不同的虚拟机会有不同的垃圾收集器的实现,我们主要讨论的是默认的HotSpot虚拟机,这个虚拟机包含的垃圾收集器如下图; 如上图所示,一共有7种垃圾收集器,如果两个垃圾收集器之间有双箭头连线,则两个垃圾收集器可搭配使用。上面是新生代的收集器,下面是老年代的收集器。每个垃圾收集器都有各自适合的使用场景。 Serial 收集器 Serial 是一个“单线程”的 新生代 收集器,使用 复制 算法,它只会使用一个CPU或者一条收集器线程去完成垃圾收集工作,并且它在垃圾收集时,必须 暂停所有其他的工作线程 ,直到它收集结束。“Stop The World”会在用户不可见的情况下,把用户的工作线程全部停掉,这往往是令人难以接受的。 下图是 Serial/Serial Old 收集器运行示意图: 上图中,新生代是 Serial 收集器采用 复制 算法,老年代是 Serial Old 收集器采用 标记-整理 算法。Serial虽然是一个缺点鲜明的收集器,但它依然是虚拟机在Client模式下的默认收集器,它也有优点,比如简单高效(与其他收集器单线程相比),对于单个CPU来说

jvm生产环境的内存监控与调优-第二章

主宰稳场 提交于 2020-01-27 16:38:17
1、专门查看java 进程的工具 jps 官网链接: jps官方文档 输入命令:jps -l kjctar@kjctar - virtual - machine : ~ / Downloads / apache - tomcat - 8.5 .50 / bin$ jps - l 5376 org . apache . catalina . startup . Bootstrap (第一个数字是pid 第二个是java进程名,这里是tomcat) 7801 sun . tools . jps . Jps (jps命令的进程) 2、查看java进程运行时参数命令jstat 官网链接: jstat官方文档 输入命令: jstat -gc 5376 1000 10 (查看gc的内存状态 1000ms查一次 查询10次) kjctar@kjctar - virtual - machine : ~ / Downloads / apache - tomcat - 8.5 .50 / bin$ jstat - gc 5376 1000 10 S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT 2560.0 2560.0 0.0 2544.0 31744.0 16132.0 42496.0 8638.6 15104.0

JVM调优

南楼画角 提交于 2020-01-25 00:43:36
#查看pid,提取Bootstrap的ID jps #查看class加载统计 jstat -class $pid #查看编译统计 jstat -compiler $pid #查看gc统计 YGC为年轻代垃圾回收次数 YGCT为年轻代垃圾回收消耗时间 GCT为垃圾回收消耗总时间 jstat -gc $pid #查看内存使用情况 jmap -heap $pid #查看内存中活跃对象数量及大小 jmap -histo:live $pid | more 来源: CSDN 作者: 壹只小提莫 链接: https://blog.csdn.net/yaowanliang/article/details/103834075

【JVM】垃圾收集器以及内存分配

二次信任 提交于 2020-01-24 00:03:19
文章目录 前言 串行垃圾收集器 编写测试代码 设置垃圾回收为串行收集器 并行垃圾收集器 ParNew垃圾收集器 ParallelGC垃圾收集器 CMS垃圾收集器 测试 G1垃圾收集器(重点) 原理 Remembered Set(已记忆集合) Mixed GC 全局并发标记 拷贝存活对象 G1收集器相关参数 测试 对于G1垃圾收集器优化建议 前言 前面分享了垃圾回收的算法,还需要有具体的实现,在jvm中,实现了多种垃圾收集器,包括:串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器、G1垃圾收集器,接下来,我们一个个的了解学习。 串行垃圾收集器 串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW(Stop-The-World)。对于交互性较强的应用而言,这种垃圾收集器是不能够接受的。一般在Javaweb应用中是不会采用该收集器的。 编写测试代码 import java . util . ArrayList ; import java . util . List ; import java . util . Properties ; import java . util . Random ; public class TestGC { public static void

JVM 调优实战--常见的垃圾回收算法及垃圾收集器组合

回眸只為那壹抹淺笑 提交于 2020-01-19 12:06:40
什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种类型的问题: 忘记回收 多次回收 没有任何引用指向的一个对象或者多个对象(循环引用) 如何定位垃圾 ①引用计数法 ②跟可达算法 常见的垃圾回收算法 标记清除 - 位置不连续 产生碎片 效率偏低(两遍扫描) 拷贝算法 - 没有碎片,浪费空间 标记压缩 - 没有碎片,效率偏低(两遍扫描,指针需要调整) JVM内存分代模型 jdk1.7永久代存放的是各种Class文件,如使用Spring等框架会产生大量代理对象,它们的Class对象就存放在永久代中。 字符串常量:1.7是存放在永久代方法区MethodArea中,1.8存放在堆中。 MethodArea方法区: ①1.7叫做Perm Generation,1.8叫做Metaspace元数据区。 ②里面存放的是class的元信息,代码的编译信息,各种层次信息,JIT编译信息(JNI)等凡是跟JVM自身的class无关的其他信息都存放在方法区这个逻辑分区里面。 ③在1.7版本,必须指定固定大小,而且很容易溢出。1.8之后内存的大小设置受限于物理内存,既可以设置也可以不设置,不设置理论上在物理内存范围内无上限。 堆内存:包括年轻代和老年代 堆外内存

jvm性能调优

99封情书 提交于 2020-01-13 07:46:51
一、JVM内部结构 ​ 程序计数器 类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是本地方法,这里的值是Undefined。 栈 虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。 如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。 堆 如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。 新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。Java堆只要求逻辑上是连续的

[转帖]4. GC 算法(实现篇) - GC参考手册

﹥>﹥吖頭↗ 提交于 2020-01-11 08:36:51
4. GC 算法(实现篇) - GC参考手册 https://blog.csdn.net/renfufei/article/details/54885190 翻译 铁锚 发布于2017-02-05 23:58:36 阅读数 11033 收藏 展开 您应该已经阅读了前面的章节: 垃圾收集简介 - GC参考手册 Java中的垃圾收集 - GC参考手册 GC 算法(基础篇) - GC参考手册 学习了GC算法的相关概念之后, 我们将介绍在JVM中这些算法的具体实现。首先要记住的是, 大多数JVM都需要使用两种不同的GC算法 —— 一种用来清理年轻代, 另一种用来清理老年代。 我们可以选择JVM内置的各种算法。如果不通过参数明确指定垃圾收集算法, 则会使用宿主平台的默认实现。本章会详细介绍各种算法的实现原理。 下面是关于Java 8中各种组合的垃圾收集器概要列表,对于之前的Java版本来说,可用组合会有一些不同: Young Tenured JVM options Incremental(增量GC) Incremental -Xincgc Serial Serial -XX:+UseSerialGC Parallel Scavenge Serial -XX:+UseParallelGC -XX:-UseParallelOldGC Parallel New Serial N/A Serial

JVM性能调优工具之jmap

江枫思渺然 提交于 2020-01-07 21:06:56
参考文章: JVM性能调优工具之jmap jmap pid 使用jps找到需要处理的进程ID,使用jmap pid即可查看内存的映像信息。 jmap -heap pid 打印堆的摘要信息,包括GC算法、堆配置信息以及各内存区域内存使用信息。 jmap -histo:live pid | head -20 打印堆中对象的统计信息。(加上head参数可以只筛选出前面20行) jmap -clstats pid 打印类加载器信息。 jmap -finalizerinfo pid 打印等待终结的对象信息。 jmap -dump:format=b,file=heapdump.hprof pid 以hprof二进制格式转储Java堆到指定filename的文件中。 来源: https://www.cnblogs.com/mrnx2004/p/12163533.html