基于Python机器学习算法农业数据可视化分析预测系统(完整系统源码+数据库+详细文档+论文+部署教程)

文章目录

  • 基于Python机器学习算法农业数据可视化分析预测系统
    • 完整源码获取方式在文章末尾
    • 一、项目简介
    • 二、开发环境
    • 三、项目技术
    • 四、功能结构
    • 五、功能实现
      • 模型构建
      • 封装类用于网格调参
      • 训练模型
      • 系统可视化数据请求接口
      • 模型评分 0.5*mse
    • 六、系统实现
    • 七、总结
    • 完整源码获取

基于Python机器学习算法农业数据可视化分析预测系统

完整源码获取方式在文章末尾

一、项目简介

基于python机器学习XGBoost算法农业数据可视化分析预测系统,旨在帮助农民和相关从业者更好地预测农作物产量,以优化农业生产。该系统主要包括四个功能模块。

首先,农作物数据可视化模块利用Echarts、Ajax、Flask、PyMysql技术实现了可视化展示农作物产量相关数据的功能。

其次,产量预测模块使用pandas、numpy等技术,通过对气象和农作物产量关系数据集的分析和训练,实现了对农作物产量的预测功能。该模块可以对当前或未来某一时间段的农作物产量进行预测,并提供预测结果的可视化展示。

然后,用户登录与用户注册模块使用layui、Flask、PyMysql技术实现了用户登录和注册功能。用户可以通过登录系统后,利用该系统提供的预测和可视化功能,更好地规划和管理自己的农业生产。

最后,数据管理模块使用layui、Flask、PyMysql技术,实现了用户管理、公告管理和农作物数据管理等功能。系统管理员可以通过后台界面对用户信息、公告信息和农作物数据进行管理和维护,保证系统的正常运行和信息安全。

本系统的实现对农业生产的优化具有积极的意义。通过对气象和农作物产量关系数据的分析和训练,该系统可以帮助用户更好地了解不同作物产量随时间变化的趋势和规律,提高农作物的产量和品质,促进农业生产的可持续发展。

二、开发环境

开发环境版本/工具
PYTHON3.x
开发工具PyCharm2021
操作系统Windows 10
内存要求16GB
浏览器Firefox
数据库MySQL 8.0
数据库工具Navicat Premium 15
项目框架FLASK、layui

三、项目技术

后端:Flask、sklearn、PyMySQL、MySQL、urllib

前端:Jinja2、Jquery、Ajax、layui

四、功能结构

农业数据大屏可视化模块:通过ECharts实现数据可视化,展示农作物产量的趋势、关联因素等。

机器学习预测农作物产量模型构建与训练:使用Scikit-learn、Pandas、NumPy构建机器学习模型,对农作物产量进行预测。

用户登录与注册:通过Flask、PyMySQL、LAYUI实现用户登录和注册功能。

系统后台管理模块:

​ 用户模块:管理用户信息,权限等。

​ 公告模块:发布和管理系统相关公告信息。

​ 农作物数据管理模块:存储和管理与农作物产量预测相关的数据集。

​ 预测可视化后台交互:提供用户与预测数据的交互界面,使用Ajax请求后端数据接口展示数据可视化结果。
系统结构图
在这里插入图片描述

五、功能实现

模型构建

def model(X_data,y_label,testst,prediction):
    """模型搭建
    """
    global params_xgb  #模型参数,设置全局变量便于调参
    n_splits = 25
    res = []
    kf = KFold(n_splits = n_splits, shuffle=True, random_state=520)
    for i, (train_index, test_index) in enumerate(kf.split(X_data)):
        print('第{}次训练...'.format(i+1))

        train_data = X_data.iloc[train_index]
        train_label = y_label.iloc[train_index]

        valid_data = X_data.iloc[test_index]
        valid_label = y_label.iloc[test_index]

        xgb_train = xgb.DMatrix(train_data, label=train_label)
        xgb_valid = xgb.DMatrix(valid_data, valid_label)
        evallist = [(xgb_valid, 'eval'), (xgb_train, 'train')]
        cgb_model = xgb.train(params_xgb, xgb_train, num_boost_round=500 , evals=evallist, verbose_eval=500, early_stopping_rounds=300, feval=myFeval)

        valid = cgb_model.predict(xgb_valid, ntree_limit=cgb_model.best_ntree_limit)
        valid_score = mean_squared_error(valid_label,valid)*0.5
        if valid_score > 0.01:
            #验证集分数不好的模型丢弃
            continue
        xgb_test = xgb.DMatrix(testst)
        preds = cgb_model.predict(xgb_test, ntree_limit=cgb_model.best_ntree_limit)

        res.append(preds)

        print("\n")

在这里插入图片描述

使用XGBoost(Extreme Gradient Boosting)算法进行回归任务的模型搭建函数。

  1. 参数说明:
    • X_data: 训练数据的特征。
    • y_label: 训练数据的目标标签。
    • testst: 测试数据的特征,用于进行预测。
    • prediction: 预测结果的存储列表。
  2. 交叉验证:
    • 该模型使用了 K 折交叉验证(KFold),将数据集分成训练集和验证集,循环进行训练和验证。这有助于评估模型的性能,并减少由于数据集划分不同而引起的波动。
  3. XGBoost模型训练:
    • 使用 XGBoost 中的 xgb.train 函数进行模型训练。
    • 参数 params_xgb 是全局变量,应该在代码其他地方定义,包含了 XGBoost 模型的超参数设置。
    • 训练中使用了早停法(early stopping),如果在一定迭代次数内验证集分数没有提高,则提前结束训练。
  4. 模型预测:
    • 使用训练好的模型对验证集和测试集进行预测。
    • 验证集预测结果与真实标签计算均方误差(Mean Squared Error),如果分数大于0.01,则该模型被丢弃。
    • 如果验证集分数较好,将测试集的预测结果添加到 res 列表中。
  5. 输出信息:
    • 打印每次训练的信息,包括训练次数、验证集分数等。

封装类用于网格调参

class XGBoostre(object):
    """封装类用于网格调参
    """
    def __init__(self,**kwargs):
        self.params = kwargs
        if "num_boost_round" in self.params:
            self.num_boost_round = self.params["num_boost_round"]
        self.params.update({'objective': 'reg:squarederror','silent': 0,'seed': 1000})

    def fit(self,x_train,y_train):
        xgb_train = xgb.DMatrix(x_train, label=y_train)
        self.bst = xgb.train(params=self.params, dtrain=xgb_train, num_boost_round=self.num_boost_round,  verbose_eval=100, feval=myFeval)

    def predict(self,x_pred):
        dpred = xgb.DMatrix(x_pred)
        return self.bst.predict(dpred)

    def kfold(self,x_train,y_train,n_fold=5):
        xgb_train = xgb.DMatrix(x_train, label=y_train)
        bst_cv = xgb.cv(params=self.params, dtrain=xgb_train,feval=myFeval,num_boost_round=self.num_boost_round, nfold=n_fold,)
        return bst_cv.iloc[-1,:]

    def plt_feature_importance(self):
        feat = pd.Series(self.bst.get_fscore()).sort_values(ascending=False)
        feat.plot(title = "Feature_importance")

    def get_params(self,deep=True):
        return self.params

    def set_params(self,**params):
        self.params.update(params)
        return self

在这里插入图片描述

  1. 初始化方法 __init__
    • 这个方法用于初始化XGBoostre类的实例。
    • 使用**kwargs来接收任意数量的关键字参数,并将这些参数存储在self.params字典中。
    • 如果"num_boost_round"存在于self.params中,则将其值存储在self.num_boost_round中。
    • 设置默认的XGBoost参数,包括目标函数为'reg:squarederror',不进行静默操作('silent': 0),并设置随机种子为1000。
  2. fit 方法
    • 该方法用于训练XGBoost模型。
    • 将训练数据x_trainy_train转换为xgb.DMatrix格式。
    • 使用xgb.train函数进行模型训练,并保存训练好的模型为self.bst
  3. predict 方法
    • 该方法用于使用训练好的模型进行预测。
    • 将待预测数据x_pred转换为xgb.DMatrix格式。
    • 使用训练好的模型self.bst进行预测,并返回预测结果。
  4. kfold 方法
    • 该方法执行K折交叉验证。
    • 使用xgb.cv函数进行K折交叉验证,并返回交叉验证的结果。
  5. plt_feature_importance 方法
    • 该方法用于绘制特征重要性。
    • 获取模型中特征的重要性得分,并将其排序。
    • 使用pd.Series.plot方法绘制特征重要性的条形图。
  6. get_params 方法
    • 该方法用于获取当前设置的XGBoost参数。
    • 返回存储在self.params中的参数。
  7. set_params 方法
    • 该方法用于更新XGBoost参数。
    • 使用传入的关键字参数更新self.params字典中的参数,并返回更新后的参数。

这个XGBoostre类为XGBoost模型提供了一个封装接口,使得用户可以更方便地进行模型训练、预测和评估,同时还可以进行参数调优和特征重要性分析。

训练模型

if __name__ == "__main__":
    deal_loss()
    change()
    change_week()
    params_xgb = {
        'booster': 'gbtree',
        'objective': 'reg:squarederror',
        'eval_metric': 'rmse',  # 对于回归问题,默认值是rmse,对于分类问题,默认值是error
        'gamma': 0.1,     #损失下降多少才分裂
        'max_depth': 4,
        'lambda': 1.2,    #控制模型复杂度的权重值的L2曾泽化参数,参数越大越不容易过拟合
        'subsample': 0.9,   #随机采样的训练样本
        'colsample_bytree': 0.9,    #生成树时特征采样比例
        'min_child_weight': 3,  # 6
        'silent': 0,    #信息输出设置成1则没有信息输出
        'eta': 0.12,   #类似学习率
        'seed': 1000,
        'nthread': 9,
    }
    X_data,y_label,testst,prediction = get_data()

    model(X_data,y_label,testst,prediction)


    df = pd.read_csv("result.csv",encoding="gbk")
    df["区县id"] =  df["columns"].apply(arr)

在这里插入图片描述

对预测模型进行训练和预测,然后将结果保存到一个 CSV 文件中,并进行后续的数据处理。

  1. XGBoost模型参数设置:
    • 定义了一个字典 params_xgb,包含了 XGBoost 模型的超参数设置。这些参数控制了模型的结构和训练过程。
  2. 获取数据:
    • 调用 get_data() 函数,但代码中未提供该函数的实现。这个函数用于获取训练数据 (X_data, y_label) 和测试数据 (testst)。
  3. 模型训练:
    • 调用 model 函数,传入训练数据和测试数据,进行模型训练和预测。模型的超参数通过 params_xgb 传递。
  4. 读取CSV文件并进行数据处理:
    • 使用 Pandas (pd) 读取一个 CSV 文件,文件名为 “result.csv”,使用 GBK 编码。
    • 对 DataFrame 中的 “columns” 列应用 arr 函数,但未提供 arr 函数的实现。

系统可视化数据请求接口

在这里插入图片描述

@app.route('/')
def main_page():
    month_rain = data_service.get_month_rain_volume()
    ave_wind = data_service.get_ave_wind()
    count, output, weather = data_service.get_total()
    yearly_outputs = data_service.get_yearly_output()
    months_temp = data_service.get_months_temp()
    times_selling = data_service.get_times_selling()
    months_sun = data_service.get_months_sun()
    table_list = data_service.get_table_list()
    return render_template("main.html", month_rain=month_rain,
                           ave_wind=ave_wind,
                           table_list=table_list,
                           count=count, output=output, weather=weather,
                           yearly_outputs=yearly_outputs, months_temp=months_temp,
                           times_selling=times_selling, months_sun=months_sun)
  1. 数据获取:
    • month_rain = data_service.get_month_rain_volume(): 获取月降雨量的数据,是通过调用 get_month_rain_volume 函数从 data_service 中获取。
    • ave_wind = data_service.get_ave_wind(): 获取平均风速的数据,是通过调用 get_ave_wind 函数从 data_service 中获取。
    • count, output, weather = data_service.get_total(): 获取总数、输出和天气的数据,是通过调用 get_total 函数从 data_service 中获取。
    • 其他类似的语句用于获取其他数据,如年度产出、月温度、销售次数、月日照时间等。
  2. HTML 模板渲染:
    • return render_template("main.html", ...): 使用 Flask 提供的 render_template 函数渲染 HTML 模板。传递了多个变量作为模板中的参数,这些变量包括上面获取的各种数据。
  3. 返回结果:
    • main.html 模板将使用传递的数据进行渲染,然后作为 HTTP 响应返回给用户。

模型评分 0.5*mse

def myFeval(preds, xgbtrain):
    """模型评分 0.5*mse
    """
    xgbtrain = xgbtrain.get_label() #将xgboost.core.DMatrix类转化为ndarray类别
    score = mean_squared_error(xgbtrain,preds)*0.5
    return 'myFeval', score

在这里插入图片描述

自定义评估函数 myFeval,用于在XGBoost模型训练过程中评估模型的性能。

  1. 参数解释:

    • preds: 预测的目标变量值。
    • xgbtrain: XGBoost训练数据,通常是 xgboost.DMatrix 类型。
  2. 函数逻辑:

    • xgbtrain = xgbtrain.get_label(): 将 xgbtrain 转换为 ndarray 类型,通过调用 get_label() 方法获取标签。这是将XGBoost的 DMatrix 转换为NumPy数组的操作。

    • score = mean_squared_error(xgbtrain, preds) * 0.5: 计算均方误差(Mean Squared Error,MSE),然后乘以0.5。这是一个模型评估指标,用于衡量模型预测值与实际标签之间的平方差。将MSE乘以0.5可能是为了得到更合适的评估分数。

    • return 'myFeval', score: 返回一个元组,包含自定义评估名称 ‘myFeval’ 和计算得到的分数。

      该评估函数主要用于XGBoost模型训练中,作为 eval_metric 参数的值。这个函数的设计是为了与XGBoost的内置评估函数保持一致,并且使用MSE的一半作为最终评估分数。

六、系统实现

启动项目

在这里插入图片描述

可视化模块主要实现了对各个地区农业产量的轮播数据展示、对气象变化归路展 示、对气象天气进行分类统计、对日照时间进行统计柱状图分析等功能。实现流程首先 通过浏览器发动 http 请求,Flask 接收到请求后,通过 PyMysql 对数据库进行查询,然 后格式化与分析后响应给前端,前端通过 Echarts 技术在进行可视化解析与渲染,最终 实现可视化效果。

在这里插入图片描述

用户模块核心带主要是用户登录时候的校验,这里以用户登录的业务逻辑层代码为

例,如下图 所示。

在这里插入图片描述

登录页面

在这里插入图片描述

注册页面
在这里插入图片描述

管理员登录系统后台管理:
在这里插入图片描述
系统用户管理
在这里插入图片描述

公告管理

在这里插入图片描述

产量数据管理
在这里插入图片描述

气象数据管理

在这里插入图片描述

产量预测可视化分析在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
系统个人登录管理
在这里插入图片描述

普通用户登录:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、总结

基于XGBoost的算法分析预测具有许多优势,这些优势使得XGBoost成为许多应用场景的首选算法之一。

  1. 高性能:
    • XGBoost是一种梯度提升算法,它在性能上表现出色。通过使用并行处理和基于特征的分裂方法,XGBoost能够快速、高效地处理大规模数据集。
  2. 强大的正则化:
    • XGBoost通过正则化项(如L1和L2正则化)提供了对模型的强大控制,有助于防止过拟合。这使得模型更具泛化能力,可以适用于不同的数据集。
  3. 处理缺失值:
    • XGBoost能够自动处理缺失值。在实际应用中,数据中的缺失值是常见的问题,而XGBoost能够有效地处理这些情况,而不需要进行额外的数据处理。
  4. 可解释性:
    • XGBoost具有一定的可解释性,可以输出特征的重要性得分。这对于理解模型对农作物产量预测中哪些特征起到关键作用非常有帮助,从而为农业决策提供支持。
  5. 适用于多种任务:
    • XGBoost不仅可以用于回归问题(如农作物产量预测),还可以用于分类和排序等任务。这种通用性使得XGBoost在不同类型的问题中都能够展现出色的性能。
  6. 可扩展性:
    • XGBoost具有良好的可扩展性,可以应对大规模数据和高维特征。它支持分布式计算,可以在分布式环境中运行,提高了处理大规模数据时的效率。
  7. 特征重要性评估:
    • XGBoost可以输出特征的相对重要性,帮助用户理解模型对输入特征的依赖程度。这对于农作物产量预测系统的可解释性和可理解性非常有价值。

完整源码获取

在这里插入图片描述
需要项目全套资料可扫码获取:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt程序设计-自定义QLineEdit控件添加鼠标单击事件

本文讲解Qt自定义QLineEdit控件添加鼠标单击事件。 QLineEdit控件默认没有单击事件,但是项目开发中有时需要单击事件,比如单击QLineEdit控件弹出软键盘。具体实现过程如下: 创建项目,在项目中添加一个类,命名为MyLineEdit 输入继承QLineEdit #ifndef MYLINEEDIT_H #defi…

Redis(十二)Bigkey

文章目录 游标案例生成100万测试数据key生产上限制keys */flushdb/flushall等危险命令不使用keys *&#xff1a;scan Biigkey案例多大算大发现bigkey渐进式删除生产调优示例问题 游标案例 生成100万测试数据key shell: for((i1;i<100*10000;i)); do echo "set k$i v…

分享76个节日PPT,总有一款适合您

分享76个节日PPT&#xff0c;总有一款适合您 76个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1-j7toLaBUBAJbkd85xe4VQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

HiveSQL——设计一张最近180天的注册、活跃留存表

0 问题描述 现有一个用户活跃表user_active(user_id,active_date)、 用户注册表user_regist(user_id,regist_date)&#xff0c;表中分区字段都为dt(yyyy-MM-dd)&#xff0c;用户字段均为user_id; 设计一张 1-180天的注册活跃留存表&#xff1b;表结构如下&#xff1a; 1 数据分…

【知识整理】一文理解系统服务高可用

一、如何理解高可用 1、什么是高可用 高可用性&#xff08;英语&#xff1a; High Availability&#xff0c;缩写为 HA&#xff09;&#xff0c;指系统无中断地执行其功能的能力&#xff0c;代表系统的可用性程度&#xff0c;是进行系统设计时的准则之一。 2、决定可用性的两…

【Go】一、Go语言基本语法与常用方法容器

GO基础 Go语言是由Google于2006年开源的静态语言 1972&#xff1a;&#xff08;C语言&#xff09; — 1983&#xff08;C&#xff09;—1991&#xff08;python&#xff09;—1995&#xff08;java、PHP、js&#xff09;—2005&#xff08;amd双核技术 web端新技术飞速发展&…

前端学习第四天

目录 一、复合选择器 1.后代选择器 2.子代选择器 3.并集选择器 4.交集选择器 5.伪类选择器 1.伪类-超链接&#xff08;拓展&#xff09; 二、CSS特性 1.继承性 2.层叠性 3.优先级 1.优先级-叠加计算规则 2.emmet写法 三、背景属性 1.背景图 ​编辑2.背景图平铺方…

JDK和CGLIB动态代理原理

动态代理会在程序运行时&#xff0c;自动的为原对象生成一个代理对象。该代理对象的方法会有逻辑上的增强&#xff0c;其一方面会执行增强的逻辑&#xff0c;另一方面其实就是通过反射调用被代理类的方法&#xff0c;这个调用过程跟静态代理就很像了。 JDK动态代理Demo如下&…

day04.C++库函数(常用)

目录 一.常用数学函数 #include / #include 二.常用字符串处理函数 #include / #include 2.1常见的内存函数&#xff1a; &#xff08;1&#xff09;memcpy库函数 (2)memcmp库函数 (3)memset 2.2字符串常见库函数 &#xff08;1&#xff09;strlen (2)strcpy 三、其他常…

【Transformer-Hugging Face 06/10】 数据预处理实例

目录 一、说明二、自然语言处理2.1 Pad2.2 截断2.3 构建张量 三、TensorFlow四、处理语音五、计算机视觉六、填充七、Multimodal 一、说明 在数据集上训练模型之前&#xff0c;需要将其预处理为预期的模型输入格式。无论您的数据是文本、图像还是音频&#xff0c;都需要将它们…

Vulnhub靶机:hacksudoAliens

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;hacksudoAliens&#xff08;10.0.2.46&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com…

Log360,引入全新安全与风险管理功能,助力企业积极抵御网络威胁

ManageEngine在其SIEM解决方案中推出了安全与风险管理新功能&#xff0c;企业现在能够更主动地减轻内部攻击和防范入侵。 SIEM 这项新功能为Log360引入了安全与风险管理仪表板&#xff0c;Log360是ManageEngine的统一安全信息与事件管理&#xff08;SIEM&#xff09;解决方案…

数字图像处理(实践篇)四十六 OpenCV-Python 目标定位(Features2D + Homography)

目录 一 单映射Homography 二 涉及的函数 三 实践 一 单映射Homography 在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。 单映射Homography 就是将一张图像上的点映射到另一张图像上的对应点的3x3变换矩阵。从下图中可以看出&#x

深兰科技陈海波出席CTDC2024第五届首席技术官领袖峰会:“民主化AI”的到来势如破竹

1月26日&#xff0c;CTDC 2024 第五届首席技术官领袖峰会暨出海创新峰会在上海举行。深兰科技创始人、董事长陈海波受邀出席了本届会议&#xff0c;并作为首个演讲嘉宾做了题为“前AGI时代的生产力革命范式”的行业分享。 作为国内顶级前瞻性技术峰会&#xff0c;CTDC首席技术官…

国考省考行测:判断推理,论证逻辑

国考省考行测&#xff1a;判断推理&#xff0c;论证逻辑 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和…

Linux进程信号处理:深入理解与应用(3)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;its 6pm but I miss u already.—bbbluelee 0:01━━━━━━️&#x1f49f;──────── 3:18 &#x1f504; ◀️…

SQL 表信息 | 统计 | 脚本

介绍 统计多个 SQL Server 实例上多个数据库的表大小、最后修改时间和行数&#xff0c;可以使用以下的 SQL 查询来获取这些信息。 脚本 示例脚本&#xff1a; DECLARE Query NVARCHAR(MAX)-- 创建一个临时表用于存储结果 CREATE TABLE #TableSizes (DatabaseName NVARCHAR…

游泳哪个牌子口碑最好?全球最好的游泳耳机排行榜

在水中畅游时&#xff0c;倾听悠扬的音乐或放松的声音是一种愉悦的体验&#xff0c;而蓝牙游泳耳机的出现更是为游泳者提供了更便利的选择。市场上涌现出多款不同品牌的蓝牙游泳耳机&#xff0c;为了满足游泳爱好者对音乐的需求&#xff0c;小编为大家精心整理了一些值得推荐的…

C++多线程学习[五]:RAII锁

一、什么是RAII 使用局部对象来控制资源的技术&#xff0c;即它的生命周期由操作系统来管理&#xff0c;无需人工的介入。 为什么要采用RAII技术呢&#xff1f; 主要是在开发过程中资源的销毁容易忘记&#xff0c;容易造成死锁或内存泄露。 {}为一个区域 &#xff0c;这里锁的…

JVM 性能调优 - 参数调优(3)

查看 JVM 内存的占用情况 编写代码 package com.test;public class PrintMemoryDemo {public static void main(String[] args) {// 堆内存总量long totalMemory Runtime.getRuntime().totalMemory();// jvm 试图使用的最大堆内存long maxMemory Runtime.getRuntime().maxM…