我的编程空间,编程开发者的网络收藏夹
学习永远不晚

大数据框架中的Java虚拟机优化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

大数据框架中的Java虚拟机优化

由于使用习惯等关系,业内主流的大数据处理框架都采用Java语言进行编写。原因在于以下几点:

1、很多程序开发人员对于Java语言比较熟悉,使用起来轻车熟路;

2、Java提供了便捷的自动内存管理机制,避免了用户在处理内存过程中可能出现的问题;

3、Java基于JVM运行的特性使得Java程序可以一次编写,多处运行,摆脱分布式集群中不同操作系统和硬件处理框架带来的束缚,使得开发者可以更加专注于代码逻辑的开发;

4、Java语言拥有成熟的社区和丰富的编程资源,可以实现快速开发,出现问题也可以快速寻求帮助。

正是基于这些优点,Java语言成为了目前最主流大数据编程技术。但是,在实际使用的过程中,开发者们发现了一系列JVM相关的性能瓶颈,主要包括以下几个方面:

1、垃圾回收(GC)占用时间长,在一些大数据应用中,GC时间甚至可以达到总执行时间的50%;

2、GC频率高,造成任务执行频繁暂停,应用吞吐率降低,响应延迟升高;

3、GC算法挤占应用线程CPU资源,存在GC线程竞争时,大数据应用执行时间增长可达60%;

4、数据对象在分布式节点间传输时需要序列化和反序列化,在某些大数据应用中,用时占比可达30%;

5、JVM冷启动时需要大量的类加载和代码即时编译工作,在应用执行中的用时可达数十秒;

6、JVM运行和维护需要内存消耗,在内存紧张的情况下,可能因为内存耗尽或内存碎片触发OOM错误。

总的来说,这些问题的产生,可以归纳为以下一些原因:

1、内存使用压力增大

与普通的Java应用不同,大数据应用是“内存密集”型的,应用的内存使用量更大,在大数据处理框架下,JVM的内存使用压力具体来源于:

(1)大数据应用数据计算和存储产生的大量内存消耗,大量数据在计算过程中需要同时被读取到内存中,而一些应用为了更进一步加快处理速度,将中间数据的聚合和可重用数据也缓存在内存当中,这决定了JVM在执行大数据应用时将面对更大的内存使用量;

(2)数据在JVM堆内存当中以对象的形式存储需要额外的内存占用,对象在JVM当中的数据结构包含了对象头以及对其它对象的引用,而数据本身在对象中的空间占比往往不超过一半。这些对象的外壳伴随着数据缓存在内存当中,也需要占用相当数量的空间;

由于JVM垃圾回收机制的原因,会经常触发全局暂停,而这个问题很难通过简单的增减内存大小来解决,如果降低内存大小,GC的触发频率会增加,对象被扫描和的去的次数增加,应用程序的吞吐量相应降低。可用内存不足还会影响到应用的正常缓存和处理机制,甚至引发内存溢出。而如果提升内存大小,单次GC则需要处理更多的数据对象,平均的暂停时间加长,应用程序的最大延迟相应增加。对于周期性标记扫描的GC算法而言,还会在最终触发GC之前消耗更多CPU时序进行不必要的标记。

2、内存使用模式变化

大数据应用中数据在内存当中保留的时间周期与普通应用不尽相同。在传统应用中,堆内存中创建的绝大部分对象在产生之后不久就不再被使用,经典的GC算法正是基于这种内存使用模式,将堆内存进行粗粒度的年代划分,绝大部分瞬时对象会在针对年轻代的Minor GC当中很快被清理。而大数据应用产生的对象有两种,一种是由控制大数据处理框架运行逻辑的代码产生的,即控制路径对象,它们的内存使用模式一般依旧符合弱世代假设。另一种是输入数据和计算中间数据在大数据处理框架中封装生产的,统称为数据路径对象。这种对象的内存使用模式要更加复杂,它们可能在内存中长时间累积或缓存,也可能在一个迭代轮次后被清理和输出。通常来说,数据路径所创建的对象数量远超控制路径。传统GC算法并不能适应大数据环境下内存使用模式的这种变化,原因在于:

(1)当前GC算法下,长时间存活的数据路径对象最终都会晋升到老年代中,它们在数次Minor GC当中幸存并最终晋升的过程中,需要在内存中多次移动。而对象移动是GC循环当中最耗时的部分,每一次移动都意味着内存读写,而内存位置的改变也需要对相关引用的指针进行更新。考虑到数据路径对象的数量极为庞大,整个晋升过程会消耗大量CPU时间,触发多次GC暂停;

(2)数据路径对象在晋升到老年代之后,在作业执行的时间尺度上,短时间内也不会被回收。传统的GC算法不会考虑这些对象的存活时间,在涉及到老年代空间的MajorGC或者Mixed GC之前还是会整个堆内存空间进行标记扫描,这些标记扫描过程对于长时间存活的数据对象来说是不必要的。当长时间存活对象占用老年代的比例过高,每次传出较大代价的Major GC就只能回收有限大小的空间,可能造成GC频繁触发,部分缓存数据被迫转移到磁盘,甚至出现OOM错误,浪费大量的CPU时间和全局暂停时间,影响到应用执行效率。

3、JVM与上层框架存在隔阂

大数据处理框架将计算任务分配到各个执行器JVM节点之后,并不会干预JVM的具体执行过程,每个执行器JVM独立运行,并不感知分布式集群中其它执行器JVM的执行情况,作业的整体进度,以及集群和节点的内存资源使用情况,只是根据自身的运行状态作出触发GC,调整堆内存,进行代码即时编译等决策,而这些决策从历史和全局的角度上观察可能并不是最优的。原因在于:

(1)JVM不清楚任务执行产生的数据对象特征,例如对象数量、内存占用大小、生命周期等,只能根据弱世代假说,对所有对象进行统一的管理。由于大数据应用产生的大量对象长时间存活,JVM的内存管理效率会受到严重影响,而这些对象本可以通过大数据框架对用户代码和数据流的全局静态分析进行甄别。

(2)大数据处理框架并不考虑JVM具体的内存管理机制,将所有JVM节点的内存当做连续的全局地址空间,但是实际上JVM在GC算法下对堆内存采取分代管理,存在非连续区域,对象在内存中离散分布,另外大数据处理框架在采用全局地址空间的物理架构下,可能产生大量跨节点对对象引用,给JVM的GC任务带来了远程内存访问的负担。

(3)大数据处理框架下的JVM之间不清楚彼此的运行情况,如果大数据操作需要在各个JVM之间同步,由于JVM独立进行GC决策,大数据操作的执行就可能被不同的JVM的GC连续打断,另外由于互相不感知,处于同一物理节点的JVM之间可能内存资源分配不合理,而大数据框架在相关问题上缺少统筹协调。

因此,开发者们需要针对这些问题产生的原因,进行针对性优化。我们下次文章将会继续讨论这个问题。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

大数据框架中的Java虚拟机优化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

大数据框架中的Java虚拟机优化

Java基于JVM运行的特性使得Java程序可以一次编写,多处运行,摆脱分布式集群中不同操作系统和硬件处理框架带来的束缚,使得开发者可以更加专注于代码逻辑的开发。

iterate在大数据批处理框架中的优化

在大数据批处理框架中,如Apache Hadoop和Spark,iterate函数或类似的概念通常用于迭代数据集。优化iterate函数的性能可以显著提高数据处理速度。以下是一些建议:使用更高效的数据结构:根据你的需求选择合适的数据结构。例
iterate在大数据批处理框架中的优化
2024-09-22

数据中心&虚拟化的的优势

欢迎各位阅读本篇,数据中心管理员正在寻求各种途径来提高硬件的利用率,实现节能、提高数据的可用性和可扩展性的目的。虽然虚拟服务器就能够实现以上所提及的目标,然而,这些优势只意味着虚拟化潜力的很小一部分。本篇文章讲述了数据中心&虚拟化的的优势,编程学习网教育平台提醒各位:本篇文章纯干货~因此大家一定要认真阅读本篇文章哦!
数据中心&虚拟化的的优势
2024-04-23

如何优化 Java 工作流框架中的数据库交互?(java工作流框架如何优化数据库交互 )

在Java开发中,工作流框架的使用越来越广泛,而数据库交互是其中的关键部分。良好的数据库交互优化可以提高系统的性能、稳定性和可扩展性。以下是一些关于如何优化Java工作流框架中数据库交互的方法:一、使用连接池连接池是优化
如何优化 Java 工作流框架中的数据库交互?(java工作流框架如何优化数据库交互  )
Java2024-12-16

Java虚拟机内存优化的方法

这篇文章主要介绍“Java虚拟机内存优化的方法”,在日常操作中,相信很多人在Java虚拟机内存优化的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java虚拟机内存优化的方法”的疑惑有所帮助!接下来,请跟
2023-06-17

优化数据中心机架和设备的 5 大理由

保持优化的设备布局对于数据中心性能和正常运行至关重要,那么管理员应该如何进行适当的操作?

如何进行JVM虚拟机中Java的编译期优化与运行期优化

这篇文章将为大家详细讲解有关如何进行JVM虚拟机中Java的编译期优化与运行期优化,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java编译期优化java语言的编译期其实是一段不确定的操作过
2023-06-02

在虚拟机中运行 Linux 的十大优点

你可以在虚拟机环境里运行任何操作系统,不论是测试还是为了某种需要。
虚拟机Linux2024-12-02

浅谈Java虚拟机对内部锁的四种优化方式

自Java 6/Java 7开始,Java虚拟机对内部锁的实现进行了一些优化。这些优化主要包括锁消除(Lock Elision)、锁粗化(Lock Coarsening)、偏向锁(Biased Locking)以及适应性锁(Adaptive
2023-05-31

使用宝塔面板进行Java虚拟机的优化配置

Java虚拟机优化配置简介:优化JVM配置可提升性能和稳定性。宝塔面板可简化配置,满足应用程序需求。优化步骤:调整内存分配:Xms和Xmx选择垃圾收集器:G1GC或ParallelGC配置堆外内存:-XX:MaxDirectMemorySize启用编译优化:-XX:+TieredCompilation启用性能监控:-XX:+PrintGCDetails应用其他优化:-Xverify:none等示例配置:-Xms2048m-Xmx4096m-XX:+G1GC-XX:MaxDirectMemorySize=5
使用宝塔面板进行Java虚拟机的优化配置
2024-04-12

数据中心虚拟化的八个好处

与传统数据中心相比,虚拟化数据中心显然具有许多优势。尽管转型过程中需要考虑各种因素,但我们正在进入一个全球范围内数据中心需求旺盛的时代。虚拟化提供的灵活性对于跟上行业的快速发展和不断增长的客户需求至关重要。

使用宝塔面板进行Java虚拟机的优化配置

要使用宝塔面板进行Java虚拟机(JVM)的优化配置,可以按照以下步骤进行操作:1. 登录到宝塔面板,进入网站管理页面。2. 在网站列表中找到需要配置JVM的网站,点击进入网站管理页面。3. 在网站管理页面的左侧导航栏中找到“配置文件”选项
2023-10-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录