java 性能优化实践——JAVA 语言性能技术

	/**
     * java 性能优化实践
     *      @JAVA 语言性能技术
     *          Collections
     *          Map
     *              MultiMap Google
     *      C++情况下动态内存是手动处理的,在程序员的控制之下显式管理对象生命周期,当对象被删除,析构就发生
     *          资源的获取和释放直接和对象的生命周期相关
     *
     *      Java的内存管理子系统是一个根据需要运行的垃圾收集器
     *          在用于分配的可用内存耗尽时做出响应
     *
     *      @方法句柄
     *          @invokedynamic 更灵活的确定在调用点要执行哪个方法?
     *              直到运行时才能确定调用哪个方法
     *              当调用点通过解释器到达时,回调用一个特殊的辅助方法,所谓的引导方法BSM ,BSM返回一个对象
     *              该对象表示在这个调用点应该调用的实际方法,被称为调用目标,被加入到了这个调用点中
     *
     *          一个关键的概念是方法句柄(method handle)是一个对象,表示应该从invokedynamic调用点调用的方法
     *
     *      @并发性能技术
     *          @JMM java 内存模型
     *              试图处理的问题
     *                  当两个处理器核心访问相同的数据会发生什么?
     *                  什么时候能够保证他们看到的数据是相同的?
     *                  内存缓存对这些答案有什么影响?
     *              做出的两个保证
     *                  与排序相关的保证
     *                  与跨线程更新的可见性相关的保证
     *              @强内存模型(strong memory model)
     *                  所有核心在任何时候看到的值总是相同的
     *              @弱内存模型 weak memory model
     *                  不同的核心可能看到不同的值
     *                  有特殊的缓存机制控制这种情况出现的时机
     *              @JMM的保证基于的主要概念
     *                  @先行发生
     *                      一个事件确定在另一个事件之前发生
     *
     *                  @同步
     *                      事件将导致对象图与主内存同步
     *
     *                  @类串行
     *                      指令在执行线程之外看上去是按顺序执行的
     *
     *                  @先释放再获取
     *                      锁要先被某个线程释放,之后才可以被下一个线程获取
     *
     *              @线程对对象的状态有自己的描述,它所做的任何改变都必须刷新到主内存中,然后由访问其他先相同数据的线程重新获取。
     *              @现在我们看java关键字——synchronized指的就是持有管程(monitor)的这个线程的本地视图已经和主内存同步(synchronized-with)
     *                  synchronized 是保证数据跨多个线程的排序和可见性的一种机制。
     *
     *              @同步的方法和块不仅定义了线程必须执行同步的接触点,还定义了一些代码块,这些代码块必须在其他同步的块或方法启动之前全部完成。
     *
     *              @对于非同步访问,JMM没做出任何说明,在一个线程上所做的更改何时会对其他线程可见,没有任何保证。
     *
     *              synchronized的局限性
     *                  同等对待已锁定对象上的所有synchronized操作
     *                  锁的获取和释放必须在一个方法的级别或一个方法内的synchronized块内完成
     *                  要么获取锁,要么线程被阻塞;如果无法获取锁,则无法尝试获取锁并继续执行处理。
     *
     *              @线程之间的java同步是一种合作机制,一个不遵守则不能正常工作——苛刻的要求
     *
     *         @构建并发库
     *              java提供的核心构建块——多线程
     *                  锁(lock)和信号量(semaphore)
     *                  原子(atomic)
     *                  阻塞队列(blocking queue)
     *                  锁存器(latch)
     *                  执行器(executor)
     */

在这里插入图片描述
图来源《java 性能优化实践》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
很高兴为您介绍Spark性能优化指南——高级篇。 1. 数据倾斜问题 数据倾斜是指在Spark任务中,某些分区的数据量远远大于其他分区,导致任务执行时间过长。解决数据倾斜问题的方法包括: - 使用随机前缀或哈希分桶等方式对数据进行分区,使数据分布更加均匀。 - 对于reduceByKey等聚合操作,使用combineByKey或aggregateByKey等方法,避免数据倾斜。 - 对于join操作,使用broadcast变量或者将小表缓存到内存中,避免数据倾斜。 2. 内存管理 Spark的内存管理对于任务的性能有着重要的影响。以下是一些内存管理的优化方法: - 调整executor内存分配比例,避免OOM错误。 - 合理设置内存管理参数,如spark.memory.fraction、spark.memory.storageFraction等。 - 使用持久化存储,如cache或persist方法,避免重复计算和数据丢失。 3. 磁盘IO 磁盘IO是Spark任务中的瓶颈之一。以下是一些优化磁盘IO的方法: - 使用本地磁盘而非网络磁盘,避免网络IO带来的延迟。 - 使用压缩算法,如Snappy或LZ4,减少磁盘IO的数据量。 - 对于shuffle操作,使用Tungsten排序等优化算法,减少磁盘IO的次数。 4. 并行度 并行度是指任务中可以同时执行的任务数。以下是一些优化并行度的方法: - 调整任务的并行度,使任务能够充分利用集群资源。 - 对于shuffle操作,调整reduce任务的数量,避免过多的reduce任务导致性能下降。 - 对于数据量较大的任务,使用分区并行执行,避免单个任务的执行时间过长。 5. 网络传输 网络传输是Spark任务中的另一个瓶颈。以下是一些优化网络传输的方法: - 调整网络传输的缓存大小,使数据传输更加高效。 - 使用序列化算法,如Kryo或Java序列化,减少网络传输的数据量。 - 对于shuffle操作,使用Tungsten排序等优化算法,减少网络传输的数据量。 希望以上内容能够帮助您更好地优化Spark任务的性能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P("Struggler") ?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值