内存参数

在 Docker 里跑 Java,趟坑总结

落花浮王杯 提交于 2019-12-09 00:01:37
背景: 众所周知,当我们执行没有任何调优参数(如“java-jar mypplication-fat.jar”)的 Java 应用程序时,JVM 会自动调整几个参数,以便在执行环境中具有最佳性能。 但是许多开发者发现,如果让 JVM ergonomics (即JVM人体工程学,用于自动选择和行为调整)对垃圾收集器、堆大小和运行编译器使用默认设置值,运行在 Linux 容器(docker,rkt,runC,lxcfs 等)中的 Java 进程会与我们的预期表现严重不符。 本篇文章采用简单的方法来向开发人员展示在 Linux 容器中打包 Java 应用程序时应该知道什么。 懒人超精简阅读版: a.JVM 做不了内存限制,一旦超出资源限制,容器就会出错 b.即使你多给些内存资源,也没什么卵用,只会错上加错 c.解决方案:用 Dockfile 中的环境变量来定义 JVM 的额外参数 d.更进一步:使用由 Fabric8 社区提供的基础 Docker 镜像来定义 Java 应用程序,将始终根据容器调整堆大小 详细全文: 我们往往把容器当虚拟机,让它定义一些虚拟 CPU 和虚拟内存。其实容器更像是一种隔离机制:它可以让一个进程中的资源(CPU,内存,文件系统,网络等)与另一个进程中的资源完全隔离。Linux 内核中的 cgroups 功能用于实现这种隔离。 然而

从hadoop框架与MapReduce模式中谈海量数据处理

邮差的信 提交于 2019-12-08 18:20:07
废话不说直接来一张图如下: 从JVM的角度看Map和Reduce Map阶段包括: 第一读数据:从HDFS读取数据 1、问题:读取数据产生多少个Mapper?? Mapper数据过大的话,会产生大量的小文件,由于Mapper是基于虚拟机的,过多的Mapper创建和初始化及关闭虚拟机都会消耗大量的硬件资源; Mapper数太小,并发度过小,Job执行时间过长,无法充分利用分布式硬件资源; 2 、 Mapper 数量由什么决定?? ( 1 ) 输入文件数目 ( 2 ) 输入文件的大小 ( 3 ) 配置参数 这三个因素决定的。 涉及参数: mapreduce.input.fileinputformat.split.minsize //启动map最小的split size大小,默认0 mapreduce.input.fileinputformat.split.maxsize //启动map最大的split size大小,默认256M dfs.block.size//block块大小,默认64M 计算公式:splitSize = Math.max(minSize, Math.min(maxSize, blockSize)); 例如 默认情况下:例如一个文件800M,Block大小是128M,那么Mapper数目就是7个。6个Mapper处理的数据是128M,1个Mapper处理的数据是32M

Spark (三) 性能优化

∥☆過路亽.° 提交于 2019-12-06 20:35:05
参数配置 1、spark-env.sh 2、程序通过SparkConf或System.setProperty 性能观察与日志 1)Web UI。 2)Driver程序控制台日志。 3)logs文件夹下日志。 4)work文件夹下日志。 5)Profiler工具。 调度与分区优化 1.小分区合并 频繁的过滤或者过滤掉的数据量过大就会产生问题,造成大量小分区的产生。Spark是每个数据分区都会分配一个任务执行,如果任务过多,则每个任务处理的数据量很小,会造成线程切换开销大,很多任务等待执行,并行度不高; 解决方式:可以采用RDD中重分区的函数进行数据紧缩,减少分区数,将小分区合并变为大分区。 通过coalesce函数来减少分区。这个函数会返回一个含有numPartitions数量个分区的新RDD,即将整个RDD重分区。 当分区由10000重分区到100时,由于前后两个阶段的分区是窄依赖的,所以不会产生Shuffle的操作。 但是如果分区数量急剧减少,如极端状况从10000重分区为一个分区时,就会造成一个问题:数据会分布到一个节点上进行计算,完全无法开掘集群并行计算的能力。为了规避这个问题,可以设置shuffle=true 由于Shuffle可以分隔Stage,这就保证了上一阶段Stage中的上游任务仍是10000个分区在并行计算。如果不加Shuffle

1-02JVM调优调优

こ雲淡風輕ζ 提交于 2019-12-06 19:59:26
  1.内存结构:     1.1内存布局概述       JDK1.6:              JDK1.8:将方法区移动至元空间            1.2私有内存     1.3公有内存   2.基础:参数说明( 堆参数说明 ),垃圾收集器(前置知识:垃圾回收算法,GC种类),垃圾收集器(种类,相关介绍)   3.参数调优:私有,公有(方法区,堆参数配置)   4.垃圾收集器调优   4.调优反馈 :命令行使用查看具体参数,记录分析对比。   5.原理:总结调优原则 来源: https://www.cnblogs.com/gcq243627152qq/p/11997290.html

1-01-JVM部署调优 总览

可紊 提交于 2019-12-06 17:29:31
JVM部署调优总览包括一下部分: 调优: 熟悉内存布局,基础参数,根据基础参数调优做实例,为jvm选定合适的垃圾收集器。 调优后必须看到相关数据变化,会用命令行查看调优前后具体的数值。   1.内存结构:概述,私有内存,公有内存   2.基础:参数说明( 堆参数说明 ),垃圾收集器(前置知识:垃圾回收算法,GC种类),垃圾收集器(种类,相关介绍)   3.参数调优:私有,公有(方法区,堆参数配置)   4.垃圾收集器调优   4.调优反馈 :命令行使用查看具体参数,记录分析对比。   5.原理:总结调优原则 常见问题定位:   1.内存:私有(栈溢出),公有(堆溢出) 2.CUP突然增高 3. 监控线程,内存情况 性能调优工具使用 来源: https://www.cnblogs.com/gcq243627152qq/p/11996567.html

(Metaspace)

亡梦爱人 提交于 2019-12-06 16:42:39
https://blog.csdn.net/sjmz30071360/article/details/89456177 (Metaspace) 1.背景 2.为什么废弃永久代(PermGen) 3.深入理解元空间(Metaspace) 4.总结 ========正文分割线===== 一、背景 1.1 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。 关于方法区和永久代: 在HotSpot JVM中,这次讨论的永久代,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在其他JVM上不存在永久代。 1.2 JDK8永久代的废弃 JDK8 永久代变化如下图: 1.新生代:Eden+From Survivor+To Survivor 2.老年代:OldGen 3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中) 二、为什么废弃永久代(PermGen) 2.1 官方说明 参照JEP122:http://openjdk.java.net/jeps/122,原文截取: Motivation This is part of the JRockit

提交并发量的方法:Java GC tuning :Garbage collector

只谈情不闲聊 提交于 2019-12-06 15:35:10
 三色算法,高效率垃圾回收,jvm调优  Garbage collector:垃圾回收器 What garbage? 没有任何引用指向它的对象 JVM GC回收算法: 引用计数法(ReferenceCounting) 给对象中添加一个引用计数器,每当有一个地方引用他时,计数器值就+1,;当引用失效时,计数器值就-1;任何时刻计数器为0的对象就是不可能在被使 优点:判定效率高 缺点:不会完全准确,因为如果出现两个对象相互引用的问题就不行了 很明显,到最后两个实例都不再用了(都等于null了),但是GC却无法回收,因为引用数不是0,而是1,这就造成了内存泄漏。也很明显,现在虚拟机都不采用此方式。 可达性分析算法(root seaching) 通过一系列的GC Roots的对象作为起始点,从这些根节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 说明: (2.1)、红色代表不可达对象(可回收对象) (2.2)、千万注意!!!!!上图并不是说方法区全可达,虚拟机栈部分可达,本地方法栈全部不可达,而只是为了说明这三个部分可以作为GC Roots! 3、可以作为GC Roots的对象包括以下几点 (3.1)、虚拟机栈(栈帧中的本地变量表)中引用的对象。 (3.2)

linux内核参数sysctl.conf,TCP握手ack,洪水攻击syn,超时关闭wait;

强颜欢笑 提交于 2019-12-06 14:36:38
题记:优化Linux内核sysctl.conf参数来提高服务器并发处理能力 PS:在服务器硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题。要提高Linux系统下的负载能力,可以使用nginx等原生并发处理能力就很强的web服务器,如果使用Apache的可以启用其Worker模式,来提高其并发处理能力。除此之外,在考虑节省成本的情况下,可以修改Linux的内核相关TCP参数,来最大的提高服务器性能。当然,最基础的提高负载问题,还是升级服务器硬件了,这是最根本的。 Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。 本文介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量: #netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

HBase 入门之数据刷写(Memstore Flush)详细说明

南楼画角 提交于 2019-12-06 13:53:46
接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系)。HBase 写数据(比如 put、delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写到一个称为 MemStore 的内存结构里面的,如下图: 如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop 但是,MemStore 毕竟是内存里面的数据结构,写到这里面的数据最终还是需要持久化到磁盘的,生成 HFile。如下图: 如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop 理解 MemStore 的刷写对优化 MemStore 有很重要的意义,大部分人遇到的性能问题都是写操作被阻塞(Block)了,无法写入HBase。本文基于 HBase 2.0.2,并对 MemStore 的 Flush 进行说明,包括哪几种条件会触发 Memstore Flush 及目前常见的刷写策略(FlushPolicy)。 什么时候触发 MemStore Flush 有很多情况会触发 MemStore 的 Flush 操作,所以我们最好需要了解每种情况在什么时候触发 Memstore Flush。总的来说,主要有以下几种情况会触发 Memstore Flush:

最近整理的一些常见的面试题,面试大全,黑马程序员面试宝典题库---JavaSE基础篇

自闭症网瘾萝莉.ら 提交于 2019-12-06 12:55:57
JAVA语法(左侧扫描二维码,留言“黑马面试”,自动发原件给你) 1.抽象类(abstract class)和接口(interface)有什么异同? 不同: 抽象类: 1.抽象类中可以定义构造器 2.可以有抽象方法和具体方法 3.接口中的成员全都是 public 的 4.抽象类中可以定义成员变量 5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 6.抽象类中可以包含静态方法 7.一个类只能继承一个抽象类 接口: 1.接口中不能定义构造器 2.方法全部都是抽象方法 3.抽象类中的成员可以是 private、默认、 protected、 public 4.接口中定义的成员变量实际上都是常量 5.接口中不能有静态方法 6.一个类可以实现多个接口 相同: 1.不能够实例化 2.可以将抽象类和接口类型作为引用类型 3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现, 否则该 类仍然需要被声明为抽象类 2.重载(overload )和重写(override )的区别。重载的方法能否根据返回类型进行区分? 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载; 重写发生在子类与父类之间