你知道为啥给JVM分配的内存越大,结果性能越差吗?

前言

这篇文章,给大家聊一个生产环境的实践经验:线上系统部署的时候,JVM堆内存大小是越大越好吗?

先说明白一个前提,本文主要讨论的是Kafka和Elasticsearch两种分布式系统的线上部署情况,不是普通的Java应用系统。

1、是否依赖Java系统自身内存处理数据?

先说明一点,不管是我们自己开发的Java应用系统,还是一些中间件系统,在实现的时候都需要选择是否基于自己Java进程的内存来处理数据。

大家应该都知道,Java、Scala等编程语言底层依赖的都是JVM,那么只要是使用JVM,就可以考虑在JVM进程的内存中来放置大量的数据。

还是给大家举个例子,大家应该还记得之前聊过消息中间件系统。

比如说系统A可以给系统B发送一条消息,那么中间需要依赖一个消息中间件,系统A要先把消息发送到消息中间件,然后系统B从这个消息中间件消费到这条消息。

大家看下面的示意图。

大家应该都知道,一条消息发送到消息中间件之后,有一种处理方式,就是把这条数据先缓冲在自己的JVM内存里。

然后过一段时间之后,再从自己的内存刷新到磁盘上去,这样可以持久化保存这条消息,如下图。

2、依赖Java系统自身内存有什么缺陷

如果用类似上述的方式,依赖Java系统自身内存处理数据,比如说设计一个内存缓冲区,来缓冲住高并发写入的大量消息,那么是有其缺陷的。

最大的缺陷,其实就是JVM的GC问题,这个GC就是垃圾回收,这里简单说一下他是怎么回事。

大家可以想一下,如果一个Java进程里老是塞入很多的数据,这些数据都是用来缓冲在内存里的,但是过一会儿这些数据都会写入磁盘。

那么写入磁盘之后,这些数据还需要继续放在内存里吗?

明显是不需要的了,此时就会依托JVM垃圾回收机制,把内存里那些不需要的数据给回收掉,释放掉那些内存空间腾出来。

但是JVM垃圾回收的时候,有一种情况叫做stop the world,就是他会停止你的工作线程,就专门让他进行垃圾回收。

这个时候,他在垃圾回收的时候,有可能你的这个中间件系统就运行不了了。

比如你发送请求给他,他可能都没法响应给你,因为他的接收请求的工作线程都停了,现在人家后台的垃圾回收线程正在回收垃圾对象。

大家看下图。

虽然说现在JVM的垃圾回收器一直在不断的演进和发展,从CMS到G1,尽可能的在降低垃圾回收的时候的影响,减少工作线程的停顿。

但是你要是完全依赖JVM内存来管理大量的数据,那在垃圾回收的时候,或多或少总是有影响的。

所以特别是对于一些大数据系统,中间件系统,这个JVM的GC(Garbage Collector,垃圾回收)问题,真是最头疼的一个问题。

3、优化为依赖OS Cache而不是JVM

所以类似Kafka、Elasticsearch等分布式中间件系统,虽然也是基于JVM运行的,但是他们都选择了依赖OS Cache来管理大量的数据。

也就是说,是操作系统管理的内存缓冲,而不是依赖JVM自身内存来管理大量的数据。

具体来说,比如说Kafka吧,如果你写一条数据到Kafka,他实际上会直接写入磁盘文件。

但是磁盘文件在写入之前其实会进入os cache,也就是操作系统管理的内存空间,然后过一段时间,操作系统自己会选择把他的os cache的数据刷入磁盘。

然后后续在消费数据的时候,其实也会优先从os cache(内存缓冲)里来读取数据。

相当于写数据和读数据都是依托于os cache来进行的,完全依托操作系统级别的内存区域来进行,读写性能都很高。

此外,还有另外一个好处,就是不要依托自身JVM来缓冲大量的数据,这样可以避免复杂而且耗时的JVM垃圾回收操作。

大家看下面的图,其实就是一个典型的Kafka的运行流程。

然后比如Elasticsearch,他作为一个现在最流行的分布式搜索系统,也是采用类类似的机制。

大量的依赖os cache来缓冲大量的数据,然后在进行搜索和查询的时候,也可以优先从os cache(内存区域)中读取数据,这样就可以保证非常高的读写性能。

4、老司机经验之谈

依赖os cache的系统JVM内存越大越好?

所以现在就可以进入我们的主题了,那么比如就以上述说的kafka、elasticsearch等系统而言,在线上生产环境部署的时候,你知道他们是大量依赖于os cache来缓冲大量数据的。

那么,给他们分配JVM堆内存大小的时候是越大越好吗?

明显不是的,假如说你有一台机器,有32GB的内存,现在你如果在搞不清楚状况的情况下,要是傻傻的认为还是给JVM分配越大内存越好,此时比如给了16G的堆内存空间给JVM,那么os cache剩下的内存,可能就不到10GB了,因为本身其他的程序还要占用几个GB的内存。

那如果是这样的话,就会导致你在写入磁盘的时候,os cache能容纳的数据量很有限。

比如说一共有20G的数据要写入磁盘,现在就只有10GB的数据可以放在os cache里,然后另外10GB的数据就只能放在磁盘上。

此时在读取数据的时候,那么起码有一半的读取请求,必须从磁盘上去读了,没法从os cache里读,谁让你os cache里就只能放的下10G的一半大小的数据啊,另外一半都在磁盘里,这也是没办法的,如下图。

那此时你有一半的请求都是从磁盘上在读取数据,必然会导致性能很差。

所以很多人在用Elasticsearch的时候就是这样的一个问题,老是觉得ES读取速度慢,几个亿的数据写入ES,读取的时候要好几秒。

那能不花费好几秒吗?你要是ES集群部署的时候,给JVM内存过大,给os cache留了几个GB的内存,导致几亿条数据大部分都在磁盘上,不在os cache里,最后读取的时候大量读磁盘,耗费个几秒钟是很正常的。

5、正确的做法

针对场景合理给os cache更大内存。

所以说,针对类似Kafka、Elasticsearch这种生产系统部署的时候,应该要给JVM比如6GB或者几个GB的内存就可以了。

因为他们可能不需要耗费过大的内存空间,不依赖JVM内存管理数据,当然具体是设置多少,需要你精准的压测和优化。

但是对于这类系统,应该给os cache留出来足够的内存空间,比如32GB内存的机器,完全可以给os cache留出来20多G的内存空间,那么此时假设你这台机器总共就写入了20GB的数据,就可以全部驻留在os cache里了。

然后后续在查询数据的时候,不就可以全部从os cache里读取数据了,完全依托内存来走,那你的性能必然是毫秒级的,不可能出现几秒钟才完成一个查询的情况。

整个过程,如下图所示:

所以说,建议大家在线上生产系统引入任何技术的时候,都应该先对这个技术的原理,甚至源码进行深入的理解,知道他具体的工作流程是什么,然后针对性的合理设计生产环境的部署方案,保证最佳的生产性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382070.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

计算机硬盘越大运行速度越大吗,电脑的内存越大越好吗?如果只加大内存,电脑反而会被拖慢!...

科技一直在进步,电脑的部件也都在更新换代,但是为什么原来用的好好的电脑,都慢慢的变卡了呢?除了用的时间长的器件老化,还有一个原因就是软件和系统也在跟新换代,由与硬件的进步,软件和系统也都…

通常计算机的存储容量越大性能就越好吗,容量越大越好?教你正确挑选内存的姿势...

内存是计算机中重要的配件之一,是与CPU进行沟通的桥梁。主要用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。由于计算机中所有程序的运行都是在内存中进行的,因此内存的性能以及稳定运行对计算机的影响非常大。 很多用户对内…

计算机的储存容量越大性能就越好吗,内存是否越大越好

内存是大家耳熟能祥的东西,是电脑必备的配件之一,内存是否越大越好?合适的内存有助于提升电脑的性能,带给我们更畅快的体验。小编给大家科普一下内存知识吧。 电脑内存并不是越大越好,电脑的内存大小与计算机的运算速度…

是不是虚拟内存越大越好

虚拟内存的概念是相对于物理内存而言的,当系统的物理内存空间入不敷出时,操作系统便会在硬盘上开辟一块磁盘空间当做内存使用,这部分硬盘空间就叫虚拟内存。 windows 98中采用win386.swp文件的形式,而windows 2000/XP则采用页面文…

从零开始学习 Java:简单易懂的入门指南之多态(十)

多态&包&final&权限修饰符&代码块 第一章 多态1.1 多态的形式1.2 多态的使用场景1.3 多态的定义和前提1.4 多态的运行特点1.5 多态的弊端1.6 引用类型转换1.6.1 为什么要转型1.6.2 向上转型(自动转换)1.6.3 向下转型(强制转换…

【python】一文了解Python爬虫 | 文末送书

目录 引言 1. 爬虫基础知识 1.1 什么是爬虫 1.2 HTTP协议 1.2.1 HTTP请求方法 1.GET请求 1.2.2 请求头常见字段 1.2.3 响应状态码 1.3 HTML解析 1.3.1 Beautiful Soup 解析库 1.3.2 XPath xpath解析原理: xpath 表达式 2. 爬虫进阶技巧 2.1 防止被反爬虫 2.1.1 …

iphone或者ipad上安装自己打包的ipa文件

对于非ios开发者来说,这确实是一个问题,但我懂的也不多,也是抱着试试的态度安装了下,之前我以为安装ipa和在安卓手机上安装apk一样,qq或者微信传文件下载点击就可以安装了,但这个ipa如果在iphone上这样做&a…

误删库后的恢复方法分享

省流助手:项目代码中实现定时备份功能 写在前面:项目使用的是docker发布、下午相关同事反馈题库同步功能用不了了有报错,查看服务器这个项目发布的版本发现有段时间没更新了,所以当时想的会不会因为jar包没有更新,于是…

达梦数据库的备份、还原和恢复

一、备份、还原和恢复的意义 备份的主要目的是数据容灾,保证数据的安全性,在数据库发生故障时,通过还原备份集,将数据恢复到可用状态。还原与恢复的主要目的是将目标数据库恢复到备份结束时刻的状态。 二、备份的方式 物理备份…

PhoneRescue for Mac(iOS数据恢复软件)

一款帮助用户恢复手机数据的Mac手机助手,PhoneRescue for mac是个包罗万象的iOS数据恢复程序设计用于检索您丢失的照片,音乐和更多的信息,在您的iPhone,ipad和iPod-touch上进行数据恢复。 PhoneRescue mac版安装教程 软件下载完成…

Gitlab 数据备份和还原(填坑版)

此文章适用于因更换服务器或者 gitlab 安装方式变更&#xff08;普通方式 <> docker&#xff09;进行数据迁移&#xff0c;或者日常备份还原。 前提条件&#xff1a;备份和还原的 gitlab 版本一致&#xff01; gitlab 版本查看命令&#xff1a;gitlab-rake gitlab:env:…

iOS设备数据恢复工具:UltData mac中文版

Tenorshare UltData Mac版是一款非常优秀的iOS数据恢复工具。Tenorshare UltData为您提高了3种恢复模式&#xff0c;能够在几秒钟内找回您想要的所有数据信息&#xff0c;您从此就不用担心会丢失重要信息的问题。不仅如此&#xff0c;ultdata中文版还可以对各种iOS系统问题修复…

cs231nassignment2 q4 Convolutional Neural Networks

文章目录 嫌啰嗦直接看源码Q4 Convolutional Neural Networks 卷积神经网络conv_forward_naive题面解析代码输出 conv_backward_naive题面解析代码输出 max_pool_forward_naive题面解析代码输出 max_pool_backward_naive题面解析代码输出 Fast Layers遇到的问题解决办法输出 Th…

Mac中Jmeter下载与安装

Step 1:下载 1、下载网址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 2、选择Binaries中的 apache-jmeter-5.1.tgz 进行下载&#xff08;binaries编译好的二进制压缩包&#xff1b;source为源码压缩包&#xff09; 3、下载完成后&#xff0c;双击压缩包进行解压…

Mac多线程下载工具Neat Download Manager Mac免费版

Neat Download Manager Mac版是Mac上一款免费好用的多线程下载工具。NeatDownloadManager Mac版使用动态分段算法下载文件,支持HTTP,HTTPS和FTP协议,HTTP和代理身份验证,轻松加快你的下载速度! Neat Download Manager Mac免费版软件介绍 Neat Download Manager是一个简单…

Mac10.14安装Jdk11.04版本

初语&#xff1a; 环境&#xff1a;MacOs Mojave10.14.6 Java环境&#xff1a;jdk11.04 为了学习vue的静态文件打包webpack部分&#xff0c;需要安装node.js&#xff0c;可是又依赖于java环境。电脑刷了mac系统&#xff0c;而且已经适配得很不错了现在&#xff0c;可以作为生…

Navicat Premium for Mac 11.1.8 免费中文破解版下载

之前安装的一款数据库软件Navicat试用版本到期了&#xff0c;所以在网上找了一款破解永久使用版Navicat Premium for Mac 11.1.8 完美破解版&#xff0c;完美支持OS X 10.10, 简体中文版&#xff0c;Navicat是最优秀的数据库图形化管理客户端&#xff0c;支持MySQL、SQL Server…

软件外包开发的VUE开发框架

Vue.js&#xff08;通常简称为Vue&#xff09;是一个流行的渐进式JavaScript框架&#xff0c;用于构建用户界面。它的核心库专注于视图层&#xff0c;但也可以结合其他库和工具来构建完整的单页面应用&#xff08;SPA&#xff09;。以下分享Vue.js的开发框架和特点&#xff0c;…

问道管理:短线买入点看哪个指标?

在股市投资中&#xff0c;挑选适宜的买入点是至关重要的。短线投资者常常经过技能剖析来确认买入和卖出的时机。技能剖析中有许多目标可供挑选&#xff0c;但怎么挑选适合短线交易的买入点成为一个关键问题。本文将从多个视点剖析&#xff0c;讨论针对短线交易&#xff0c;应该…

鹏业云计价i20应用技巧之清单计价与定额计价互转应用

清单计价转定额计价 应用场景&#xff1a; 定额计价模式是一种量价合一的工程计价模式&#xff0c;具有快捷简便的特点&#xff1b;工程量清单计价模式是一种量价分离模式&#xff0c;主要应用于工程招投标阶段&#xff1b;鹏业软件提供一键转换计价模式&#xff0c;适用于不…