jvm调优

spark调优——JVM调优

时光毁灭记忆、已成空白 提交于 2019-12-06 03:04:25
对于JVM调优,首先应该明确,(major)full gc/minor gc,都会导致JVM的工作线程停止工作,即stop the world。 JVM调优一:降低cache操作的内存占比 1. 静态内存管理机制 根据Spark静态内存管理机制,堆内存被划分为了两块,Storage和Execution。Storage主要用于缓存RDD数据和broadcast数据,Execution主要用于缓存在shuffle过程中产生的中间数据,Storage占系统内存的60%,Execution占系统内存的20%,并且两者完全独立。 在一般情况下,Storage的内存都提供给了cache操作,但是如果在某些情况下cache操作内存不是很紧张,而task的算子中创建的对象很多,Execution内存又相对较小,这回导致频繁的minor gc,甚至于频繁的full gc,进而导致Spark频繁的停止工作,性能影响会很大。 在Spark UI中可以查看每个stage的运行情况,包括每个task的运行时间、gc时间等等,如果发现gc太频繁,时间太长,就可以考虑调节Storage的内存占比,让task执行算子函数式,有更多的内存可以使用。 Storage内存区域可以通过spark.storage.memoryFraction参数进行指定,默认为0.6,即60%,可以逐级向下递减,如代码清单2-6所示:

JVM——垃圾回收

China☆狼群 提交于 2019-12-05 03:24:51
目录:   如何判断垃圾是否回收? 引用计数法 可达性分析算法 四种引用 引用队列   垃圾回收算法 标记清除算法 复制算法 标记整理算法   分代垃圾回收 新生代 老年代 Minor GC 和 Full GC的区别 总结   垃圾回收器 原理 串行回收器 吞吐量优先 获取最短停顿时间优先(CMS) G1   垃圾回收调优 方向 新生代调优 老年代调优 案例 一、如何判断垃圾是否回收   1.1 引用计数法   在对象头处维护一个counter, 每增加一次对该对象的引用计数器自加 ,如果 对该对象的引用失联,则计数器自减 。 当counter为0时,表明该对象已经被废弃,不处于存活状态 。这 种方式一方面无法区分软、虛、弱、强引用类别。另一方面,会造成死锁,假设两个对象相互引用始终无法释放counter,永远不能GC。        a引用者b,b引用者a,永远无法gc    1.2 可达性分析算法     1.Java 虚拟机中的垃圾回收器采用 可达性分析 来探索所有存活的对象     2. 扫描堆中的对象, GC Roots对象作为起点进行搜索 ,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被 判定为不可达的对象不一定就会成为可回收对象。 (后面再详细介绍)     3. GC停顿      

JVM调优学习---基本概念

▼魔方 西西 提交于 2019-12-04 20:44:42
数据类型 Java虚拟机中,数据类型可以分为两类: 基本类型 和 引用类型 。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress 引用类型包括: 类类型 , 接口类型 和 数组 。 基本类型 大小固定 引用类型 对象引用类型分为强引用、弱引用、软引用和虚引用 强引用: 就是我们一般声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时需要严格判断当前对象是否被强引用,如果被强引用,则不会被垃圾回收 软引用: 软引用一般被做为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。如果剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;如果剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,肯定是没有软引用存在的。 弱引用: 弱引用与软引用类似,都是作为缓存来使用。但与软引用不同,弱引用在进行垃圾回收时,是一定会被回收掉的,因此其生命周期只存在于一个垃圾回收周期内。 强引用不用说,我们系统一般在使用时都是用的强引用。而“软引用”和“弱引用”比较少见

【JVM学习笔记二】垃圾收集器与内存分配策略

那年仲夏 提交于 2019-12-04 18:26:17
1、 概述   1) GC的历史比Java久远   2) GC需要完成的三件事:     | 哪些内存需要回收     | 什么时候回收     | 如何回收   3) Java内存运行时区域各个部分:     | Java虚拟机栈、计数器、本地方法栈随线程而生,随线程而灭,不需要考虑太多问题,因为方法的结束或者线程结束时,内存自然就回收了     | Java堆和方法区只有在运行时才知道需要的内存,分配和回收都是动态的,垃圾收集器所关注的是这部分内存 2、 对象已死吗?   1) 引用计数算法(Reference Counting)     | 思路:       给对象添加引用计数器,一个地方引用+1,引用失效-1,为0不可能再被使用     | 优点:       判定效率高,大部分情况下都是一个不错的算法     | 缺点:       很难解决对象间相互循环引用的问题 [主流的Java虚拟机里面没有选用引用计数算法来管理内存]   2) 可达性分析算法(Reachability Analysis)     | 思路:       通过一系列的“GC Roots”的对象作为起始点,往下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,证明此对象不可用     | 可作为GC Roots的对象:       虚拟机栈(局部变量表)中引用的对象

Java性能分析神器--VisualVM Launcher[1]

早过忘川 提交于 2019-12-04 11:39:51
Java性能分析神器1--VisualVM Launcher VisualVM 当你日复一日敲代码的时候,当你把各种各样的框架集成到一起的时候,看着大功告成成功运行的日志,有没有那么一丝丝迷茫和惆怅:这TM起的是什么玩意?每一行日志背后代表的是什么东西??他为什么就能跑起来了呢???? 这种时候不要慌,给大家推荐一款功能强大的插件:VisualVM Launcher。(eclipse就叫 VisualVM )。这个插件需要和客户端配合使用 VisualVM 。 VisualVM是集成了命令行JDK工具和轻量级分析功能的可视化工具。JVM提供了一些常用的jdk命令行工具: jstat(JVM Statistics Monitoring Tool):用于收集Hotspot虚拟机各方面的运行数据(查看虚拟机各云心状态信息),显示本地或远程虚拟机进程中的类装载,内存,垃圾收集, JIT编译等运行数据。 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程, 同时可选择性的显示虚拟机执行主类, 即执行main函数的类, 以及进程的本地虚拟机 ID(Local Virtual Machine Identifier 简称LVMID)(对于本地虚拟机进程来说,

《JVM G1源码分析和调优》读书笔记

[亡魂溺海] 提交于 2019-12-04 04:30:36
GC的相关算法与JVM的垃圾收集器 GC的相关算法 分代管理 复制算法 标记清除 标记压缩 JVM垃圾收集器 P242 表11-1 不同类型垃圾回收期比较 串行收集器 Serial。 Serial GC用于新生代,用了复制算法;Serial Old GC作用于老年代,用的是标记-压缩算法。STW 并行收集器 Parallel。Parallel new作用于新生代,使用了复制算法;Parallel old作用于老年代,用了标记-压缩算法。STW。并发收集是准确收集,不会产生浮动垃圾。 并发收集器 Concurrent-Mark-Sweep。老年代垃圾回收器。使用了标记-清除算法。分为初始标记(Initial-Mark,STW)、并发标记(Concurrent-Mark)、再次标记(Remark,STW)、并发清除(Concurrent-Sweep)。CMS因为需要存储代际的引用关系,所以有额外的存储空间的消耗。CMS不是准确收集,会产生浮动垃圾。 垃圾优先收集器 G1。按照分区进行收集,新生代的分区总是会回收,老生代则是并发标记后选择部分回收效果最好的分区。G1分为三种回收方式: 新生代回收 young、 混合回收 (mixed,既收集新生代也收集部分老年代)、 FUll GC 。 新生代回收 仅仅在开始前需要STW。 混合回收 分成两个阶段:并发标记阶段与垃圾回收阶段

JVM参数查看以及调优

妖精的绣舞 提交于 2019-12-04 03:59:26
JVM常用命令汇总: jps: 查看各个应用对应进程ID Jmap: 查看内存信息,实例个数以及占用内存大小 jmap -heap 10200(进程ID) 查看堆信息 jmap -dump:format=b,file=dump.hprof 10200(进程ID) 手动转储堆内存信息 jvisualvm: 启动jvisualvm,使用JvisualVM工具查看堆信息 启动jvisualvm 装载dump文件 查看 内存溢出的时候自动打印转存堆栈 ‐XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapDump.dump 示例代码: JVM设置:-Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapDump.dump import java.util.ArrayList; import java.util.List; public class TestAutoDump { public static void main(String args[]) { List<byte[]> lists = new ArrayList<>(); while(true) {

方向词汇

北慕城南 提交于 2019-12-03 23:40:02
SOA架构/dobbo/其他SOA框架 MySQL/PostgreSQL/memcache/mongodb/redis/Memcached/ 分布式缓存 shell编程/python脚本编程/Socket/HTTP/TCP/IP协议栈/ Linux/Mysql/PostgreSQL/高并发/高负载/高可用性设计开发/大数据/高并发/ 调优:java优化/java的优化工具/jvm/MySQL性能/故障分析/性能调优-->方法和工具 JVM/多线程并发/Java加锁机制/ Mina框架/ Java常用类内部实现/阅读、参与java开源/Tomcat十分 来源: CSDN 作者: 绝尘的绝 链接: https://blog.csdn.net/dotjar/article/details/84683264

查看JVM使用的默认的垃圾收集器

匿名 (未验证) 提交于 2019-12-03 00:33:02
一、查看步骤 cmd执行命令: java -XX:+PrintCommandLineFlags -version 输出如下(举例): -XX:UseParallelGC ,这边我们引用《深入理解Java虚拟机:JVM高级特性与最佳实践》的介绍: 也就是说,打开此开关,使用的垃圾收集器是:新生代(Parallel Scavenge),老年代(Ps MarkSweep)组合。 二、验证下,是不是那么回事吧 我用ide起了一个程序,然后在main中进行长时间睡眠。启动时,设置其VM 参数如下: 然后用Jconsole连接该程序,切换到VM概要这个tab,注意下图红圈圈出来的地方: -XX:UseParallelGC 的情况下,使用的垃圾收集器为:新生代(Ps Scanvenge),老年代(Ps MarkSweep,与Serial Old)。 三、Ps Scanvenge的简要介绍 这边附上我的简单理解:该垃圾收集器适用于新生代,采用标记复制算法、多线程模型进行垃圾收集。 与其他新生代垃圾收集器的差别是,它更关注于吞吐量,而不是停顿时间。一般来说,需要与用户交互的 程序更关注较短的停顿时间,而如果是需要达成尽量大的吞吐量的话,则该处理器会更加适合。 其通过-XX:UseAdaptiveSizePolicy参数,可以开启其自动调节功能,适用于对垃圾收集器的调优不太了解的 用户。 四

JVM性能调优实践――JVM篇

匿名 (未验证) 提交于 2019-12-03 00:19:01
在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇 JVM性能调优实践――性能指标分析 。 JVM的调优和故障处理可以使用JDK的几个常用命令工具。因为本文是基于Docker容器内部的Springboot服务。需要调整一下docker容器的启动参数,才可以使用jmap等工具。jmap命令需要使用Linux的Capability的PTRACE_ATTACH权限。而Docker自1.10在默认的seccomp配置文件中禁用了PTRACE_ATTACH。目前使用的Docker version是17.04.0-ce。支持的Capability列表可以详看 runtime-privilege-and-linux-capabilities 。 调整Capability的方式也比较方便。可以如下直接在运行参数后面加 cap_add,cap-drop $docker run --cap-add=ALL --cap-drop=MKNOD ... 也可以在compose中增加: cap_add: - ALL cap_drop: - NET_ADMIN - SYS_ADMIN 在排查问题时,一般是先通过 JVM性能调优实践――性能指标分析 中的几个命令来分析基础的服务器状态和信息