
简介《Linux下安装Java运行环境及优化》视频课配套的PDF文档面向具备基础Linux操作的Java初学者和运维入门者重点解决在虚拟机中从零搭建、配置并优化Java Web运行环境的问题。内容以免费开源的CentOS 7.9为系统示例围绕JDK 1.8、Tomcat 8.5、MySQL 8.0这一经典组合讲解安装与配置细节。资源仅1个PDF文件大小26.44MB已有384人学习下载。文档按实操顺序展开从VMware Workstation中创建Linux虚拟机、设置root与test用户开始逐步讲解JDK 1.8的下载解压与JAVA_HOME、PATH、CLASSPATH配置部署Tomcat 8.5并赋予启动脚本执行权限以及MySQL 8.0的编译安装和my.cnf参数调整同时介绍Xshell、Xftp和macOS下的ZenTermLite等远程管理工具并补充系统内存、磁盘I/O、JVM堆大小与垃圾回收策略的调优建议。文档配有截图与关键命令说明便于离线学习跟随视频课边看边练可对照完成环境部署理解每一项配置的含义也便于日后排错和二次优化。无论是搭建测试环境还是生产服务器都能从中获得可直接落地的操作思路。1. 为什么还在拿 JDK1.8 搭配 Tomcat8.5 和 MySQL8.0在一台 4GB 内存的 Linux 虚拟机上JDK 1.8、Tomcat 8.5、MySQL 8.0 这套 Java 运行环境组合依然能稳定支撑日均数万请求的测试环境。真正让服务卡顿的很少是版本太老而是系统参数优化没跟上。《Linux下安装Java运行环境及优化》配套的 PDF把整个过程拆成了四段VMware 里创建 CentOS 7.9 虚拟机解压配置 JDK部署 Tomcat再编译 MySQL。课程附件里除了 ISO 和三个 tar.gz还有一份可直接改的 my.cnf适合刚接手 Linux 服务器、需要把 Java 服务从零跑起来的开发或运维。课程里用的 CentOS 7.9 免费且维护周期长JDK 1.8 是很多老系统的运行基线Tomcat 8.5 兼容 Servlet 3.1MySQL 8.0 则补上了新特性。三者组合能覆盖大部分中小型项目的真实诉求。2. VMware 里装 CentOS 7.9从镜像到远程连接的常用命令2.1 创建虚拟机时先决定网络和磁盘用 VMware Workstation 17 新建虚拟机时选“自定义高级”而不是典型能多出几个关键控制项。操作系统类型选 Linux 后子版本要指定 CentOS 7 64 位避免之后安装 VMware Tools 时出现兼容告警。内存建议给到 2GB 以上CPU 核心数按物理机一半以内划。网络默认用 NAT意思是虚拟机通过宿主机共享网络访问外网内网 IP 由 VMware 自动分配后续改静态地址也不会影响出网。磁盘容量给 40GB 够用但要注意在“自定义硬件”里把 CD/DVD 设置为“使用 ISO 镜像文件”指向课程准备里的 CentOS-7-x86_64-DVD-2009.iso。分区不要在安装界面里选自动否则 /boot 可能只有 500MB以后内核升级容易不够。我一般这样分/boot 分配 1024MBswap 按内存大小给剩余空间全给 /文件系统保持 ext4 或 xfs 均可。这样一份磁盘布局后续安装 MySQL 编译产物和 Tomcat 日志时完全不用再动根分区。2.2 装完系统后的初始化检查CentOS 安装完成后先登录系统跑一遍 linux 常用命令确认状态。ip addr show看 IPcat /etc/redhat-release看版本uname -r看内核。只要能看到 ens33 或 eth0 并且有 IP就可以开始远程连接。课程要求在安装时创建 root 并设置密码还创建一个叫 test 的普通用户。实际生产里外网服务器的 root 密码必须足够复杂日常操作则用 test 登录。给 test 加 sudo 权限时CentOS 7 的做法是用usermod -aG wheel test之后 test 执行需要权限的命令时前面加 sudo 即可。系统刚装完还应该顺手把 SELinux 从 enforcing 调整为 permissive因为 MySQL 编译和 Tomcat 写日志时经常被 SELinux 拦截调整方式是临时执行setenforce 0再改/etc/selinux/config里SELINUXpermissive。远程终端选择上Windows 端课程用的是 Xshell 7 和 Xftp 7macOS 上用 ZenTermLite。三者都走 SSH 协议本质一致。下表列出连接工具的关键差异工具运行平台主要用途备注Xshell 7WindowsSSH 命令行终端标签式多会话、日志记录Xftp 7WindowsSFTP 文件上传下载可配合 Xshell 直接打开ZenTermLitemacOSSSH SFTP 二合一免安装支持密钥登录系统自带 sshLinux/macOS快速排障不需要额外安装2.3 远程连接与静态 IP 的修改Xshell 连接时新建会话主机填虚拟机的 IP端口保持 22认证方式选 Password输入 test 的密码就能进入 shell。如果连不上先用systemctl status sshd确认 sshd 处于 running再检查防火墙firewall-cmd --add-port22/tcp --permanent firewall-cmd --reload。很多刚装完的 CentOS 默认防火墙并没有放行 22 端口。# 查看网络接口名 ip addr show # 把 ens33 改成静态 IP网关指向 VMnet8 的网段 nmcli con mod ens33 ipv4.addresses 192.168.20.111/24 \ ipv4.gateway 192.168.20.2 \ ipv4.dns 223.5.5.5 \ ipv4.method manual nmcli con up ens33命令里的ipv4.method manual是关键从 DHCP 切到静态时必须声明否则重启网络后地址会被自动分配覆盖。网关地址可以在 VMware 编辑菜单的“虚拟网络编辑器”里查 VMnet8 网段DNS 先填国内公共 DNS 即可。配置完再用 Xshell 重连通了说明静态 IP 没写错。Xftp 传输文件时需要注意默认会打开独立窗口左侧本地、右侧远程。把下载好的 jdk-8u202-linux-x64.tar.gz 拖到右侧之前先确认目标目录存在比如/usr/local/src。如果目录不存在Xftp 不会自动创建容易误以为上传失败。上传完后在终端里用ls -lh /usr/local/src检查文件大小是否和本地一致。3. JDK 1.8 环境变量与 Tomcat 8.5 部署的细节3.1 解压到一个约定路径而不是随意放JDK 的 tar.gz 包不校验路径但建议统一放在/usr/local/java下这样/etc/profile、setenv.sh、bin/catalina.sh里的引用都好维护。创建目录并解压mkdir -p /usr/local/java mkdir -p /usr/local/tomcat tar -zxvf /usr/local/src/jdk-8u202-linux-x64.tar.gz -C /usr/local/java cd /usr/local/java mv jdk1.8.0_202 jdk8这里把目录重命名为 jdk8是为了环境变量里不出现带点号的版本长串。后面升级 JDK 时只需要改目录链接不需要改 Tomcat 的配置。有人喜欢保留原目录名其实也 OK但统一成无版本号的目录名多版本并存时维护成本更低。3.2 环境变量配置/etc/profile 和 ~/.bashrc 怎么选/etc/profile影响所有登录用户适合服务器上只有一个主 Java 服务的情况。~/.bashrc只影响当前用户如果这台机器还要装其他语言或给别的用户隔离环境就更合适。课程文档直接改/etc/profile我倾向于先备份再做cp /etc/profile /etc/profile.bak cat /etc/profile EOF export JAVA_HOME/usr/local/java/jdk8 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF source /etc/profile注意 CLASSPATH 开头的.代表当前目录。Java 执行 class 文件时默认不会搜索当前目录不加这个点java Hello经常报 ClassNotFoundException。source只对当前会话生效如果重开一个终端发现 java 不存在说明没有重新读取/etc/profile可以先执行java -version确认。常用验证命令是java -version和echo $JAVA_HOME二者都正常说明环境变量生效。如果显示的还是系统自带的低版本 Java优先检查 PATH 中是否还有其他 jdk 的 bin 目录排在前面。3.3 Tomcat 8.5 的内存参数该写在 setenv.shTomcat 包同样解压到/usr/local/tomcattar -zxvf /usr/local/src/apache-tomcat-8.5.72.tar.gz -C /usr/local/tomcat解压后默认能启动但堆内存只有默认值流量稍大就会出现频繁 Full GC。官方不建议直接改catalina.sh里的 JAVA_OPTS因为升级 Tomcat 时会覆盖。更稳的做法是新建bin/setenv.shexport JAVA_OPTS-Xms512m -Xmx1024m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m -XX:UseG1GC -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/usr/local/tomcat/logs/写入后给文件加执行权限chmod x bin/setenv.sh。startup.sh 启动时会自动读取这个文件不需要改 catalina.sh。注意setenv.sh 里 HeapDumpPath 指向的目录必须存在否则 OOM 时拿不到堆快照。参数含义如下表参数含义建议值-Xms / -Xmx初始堆 / 最大堆测试机 512m / 1024m生产按物理内存 50%~70%-XX:MetaspaceSize元数据空间初始大小128m 起避免频繁扩容-XX:UseG1GC使用 G1 收集器JDK8 推荐开启停顿更可控-XX:HeapDumpOnOutOfMemoryErrorOOM 时导出堆快照生产必须开用于定位内存泄漏启动 Tomcat 用/usr/local/tomcat/bin/startup.sh停止用 shutdown.sh。启动后最直接的验证是curl -I http://localhost:8080看到 HTTP/1.1 200 就说明容器起来了。如果端口被占用先jps -l看有没有 Tomcat 进程再改conf/server.xml里 Connector 的 port8080。Tomcat 默认线程池也需要调conf/server.xml的 Connector 上加maxThreads200、acceptCount100、minSpareThreads20。maxThreads 不是越大越好线程数超过 CPU 核心数过多时上下文切换开销显著4 核机器开到 200 已经够用。4. MySQL 8.0.27 源码编译安装与 my.cnf 调优4.1 为什么选了源码包而不是 yum 安装CentOS 7.9 自带的软件源里默认是 MariaDB版本和 MySQL 8.0 的行为差异不小。如果直接用官方 Yum 源拉取速度不稳定且安装路径、配置文件分散不利于规范化。课程附件里的 mysql-boost-8.0.27.tar.gz 是源码包里面额外带了 boost 依赖省去了单独下载 boost 的麻烦。源码编译安装可以把可执行文件、数据目录、配置路径全部固定在 /usr/local/mysql 和 /data/mysql后续做备份和迁移更清晰。编译 MySQL 8.0 需要 cmake课程特意准备了 cmake-3.26.0.tar.gz。可以用cmake -version检查现有版本如果低于 3.5就手动编译安装。常见依赖一次性装齐yum -y install gcc-c ncurses-devel openssl-devel bison缺少 ncurses-devel 时cmake 阶段会报 “Could NOT find NCURSES”缺 openssl-devel 会在 make 后期报 SSL 相关错误所以这一步别跳。4.2 cmake 配置与 make 编译解压源码到/usr/local/src在源码目录外建一个 build 目录再运行 cmake生成的中间文件不会污染源码。cd /usr/local/src tar -zxvf mysql-boost-8.0.27.tar.gz cd mysql-8.0.27 mkdir build cd build cmake .. \ -DBUILD_CONFIGmysql_release \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DSYSCONFDIR/etc \ -DMYSQL_TCP_PORT3306 \ -DMYSQL_UNIX_ADDR/tmp/mysql.sock \ -DWITH_BOOST/usr/local/src/mysql-8.0.27/boost/boost_1_73_0 \ -DWITH_SSLsystem \ -DWITH_INNOBASE_STORAGE_ENGINE1 make -j2 make installcmake 参数里最重要的是-DWITH_BOOST必须指向源码目录内 boost 子目录的绝对路径。-DBUILD_CONFIGmysql_release以官方默认配置为主避免手动开启过多插件导致编译时间翻倍。-DSYSCONFDIR/etc让 MySQL 默认从/etc/my.cnf读取配置。make 的-j2是并行任务数虚拟机给两核就用 2内存小于 4GB 时不要用-j4否则接近内存峰值时会被 OOM。4.3 初始化数据目录并套用 my.cnf编译安装完成后先建 mysql 用户和数据目录groupadd mysql useradd -r -g mysql mysql mkdir -p /data/mysql chown -R mysql:mysql /data/mysql然后执行初始化。MySQL 8.0 不再用 mysql_install_db而是用 mysqld 自带的 --initialize/usr/local/mysql/bin/mysqld --initialize --usermysql \ --basedir/usr/local/mysql --datadir/data/mysql初始化日志里会有一条临时 root 密码形如A temporary password is generated for rootlocalhost: xxxxxx必须先记下来。注意--initialize 输出内容只在第一次执行时可见错过临时密码后只能删掉 datadir 重来一遍。接着把课程附件的 my.cnf 拷贝到/etc/my.cnf按机器配置改一下再启动。这是常用的最小生产配置[mysqld] basedir/usr/local/mysql datadir/data/mysql socket/tmp/mysql.sock port3306 max_connections500 back_log128 wait_timeout600 interactive_timeout600 innodb_buffer_pool_size512M innodb_log_file_size128M slow_query_log1 slow_query_log_file/data/mysql/slow.log long_query_time2各项参数含义如下表参数作用调试建议max_connections最大连接数从 500 起步结合 show status like Threads_connected 调整back_log连接排队数配合 max_connections高并发可加到 256innodb_buffer_pool_sizeInnoDB 缓冲池物理内存的 60%~70%4G 机器可用 2Ginnodb_log_file_sizeredo log 大小128M 可以减少日志切换频率slow_query_log慢查询开关1 开启长期生产建议配合慢查询分析工具启动 MySQL/usr/local/mysql/bin/mysqld_safe --usermysql 。启动后立刻修改 root 密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass; CREATE USER app% IDENTIFIED BY AppPass123; GRANT ALL PRIVILEGES ON *.* TO app%; FLUSH PRIVILEGES;ALTER USER是 MySQL 8.0 推荐的改密方式不要再走 UPDATE mysql.user。app 用户用 % 是为了让 Tomcat 所在的机器能够远程连接实际生产把 % 换成应用服务器 IP 更安全。5. 系统级与 JVM 优化让 Java 进程稳定跑起来5.1 文件描述符限制是第一个瓶颈Linux 默认对普通用户限制最多打开 1024 个文件Java 进程一启动连接池、日志、jar 包加起来很容易逼近这个数。超过后会报 “Too many open files”Tomcat 表现成偶发连接失败。调整方式是修改/etc/security/limits.conf* soft nofile 65535 * hard nofile 65535写完需要重新登录会话用ulimit -n确认变成 65535。CentOS 7 中还要确认/etc/security/limits.d/20-nproc.conf没有把 nofile 覆盖回去。如果用户是通过 systemd 服务启动的光改 limits.conf 不够还要在服务单元里加LimitNOFILE65535。5.2 把 JVM 的 GC 日志和堆转储开起来第 3 章的 setenv.sh 只配了堆大小运行优化还需要补上日志。更新后的 setenv.shexport JAVA_OPTS-server -Xms512m -Xmx1024m -XX:MetaspaceSize128m \ -XX:UseG1GC -XX:PrintGCDetails -XX:PrintGCDateStamps \ -Xloggc:/usr/local/tomcat/logs/gc.log \ -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath/usr/local/tomcat/logs/-server让 JVM 使用服务器模式。-XX:PrintGCDetails会把每次 GC 的前后占用写到 gc.log。对生产环境建议配合 G1 而不是只调 -XmxG1 在 JDK8 的后续更新里已经足够稳定。注意 JDK8 中-Xloggc和-XX:PrintGCDetails可以共存JDK9 以上则改用 -Xlog 语法。Tomcat 连接器配额同样影响 JVM 承载能力。在 server.xml 的 Connector 节点上我常用配置是Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 maxThreads200 minSpareThreads20 acceptCount100 /maxThreads 控制最大工作线程数acceptCount 是满线程后进入队列等待的连接数。队列设得太大用户等待时间变长设得太小则直接拒绝连接。测试环境通常 200/100 够用生产按尖峰流量重新压测后再定。5.3 用 linux 常用命令观察 Java 进程Tomcat 启动后最不该用的是ps -ef | grep java一遍遍看效率太低。JDK 自带的监控命令更精确# 列出本机 Java 进程 jps -l # 每 5 秒输出一次 GC 统计 jstat -gcutil pid 5000 # 查看堆内存配置和已用空间 jmap -heap pid # 看哪个线程真正占用 CPU top -Hp pidjstat 输出的 YGC、FGC 数值如果持续增长说明 GC 频繁jmap -heap 能确认 Eden、Survivor、Old 区是否配得合理。判断参考表命令关注指标正常信号报警信号jstat -gcutilYGC / FGC / FGCTFGC 少且 FGCT 占比低FGC 在几分钟内多次jmap -heapOld 区使用率长期低于 70%超过 85% 且持续上涨top -Hp线程 CPU%多个线程均衡单线程持续 100%需要说明的是jmap -heap 会触发一次 safe point生产系统最好在低峰期执行。真要排查线程堆栈用jstack pid thread.log再分析。6. 落地验证一条命令检查 JDK、Tomcat、MySQL 是否就绪6.1 写一个环境自检脚本在/usr/local/bin/check_env.sh写入脚本把三个组件的状态一次性暴露出来#!/bin/bash echo JDK java -version 21 | head -1 echo TOMCAT curl -s -o /dev/null -w %{http_code}\n http://localhost:8080 echo MYSQL mysqladmin -uroot -pYourStrongPass ping 2/dev/null执行前chmod x /usr/local/bin/check_env.sh然后直接运行。JDK 输出显示版本号Tomcat 输出 200MySQL 输出 mysqld is alive三项齐了就说明基础运行环境就绪。脚本里的密码是明文的只建议放在本机测试生产用配置管理工具注入。6.2 用 JDBC 打通 Tomcat 和 MySQLTomcat 能访问 MySQL 才是这套环境真正跑起来。先放一个 JDBC 驱动到/usr/local/tomcat/lib/mysql-connector-java.jar再把数据源配到conf/context.xmlResource namejdbc/appDB authContainer typejavax.sql.DataSource driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/app_db?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8 usernameapp passwordAppPass123 maxTotal20 maxIdle10/url 里必须写useSSLfalseMySQL 8.0 默认开启 SSL测试环境不关会多一次握手开销serverTimezoneAsia/Shanghai是因为新版驱动要求指定时区否则报 CST 解析异常。6.3 常见坑位速查现象原因排查/解决java: command not foundprofile 没 source 或 PATH 顺序不对重开终端echo $PATH 检查Tomcat 启动卡住但端口通了JVM 内存不足或日志权限不对看 logs/catalina.outchown -R test:test /usr/local/tomcatmysqladmin ping 失败数据目录权限错误ls -ld /data/mysql 确认属主 mysql:mysqlMySQL 编译内存不足make 并行任务太多改 make -j1加 1G swap如果换成 8GB 内存的机器记得把第 4 章 my.cnf 里innodb_buffer_pool_size从 512M 调到 1G把 setenv.sh 里的-Xmx同步提到 2G。参数变化要跟着物理资源走这套组合才能从“能装能跑”变成“装完能扛”。本文还有配套的精品资源点击获取