1. 下单之前:ECS规格选择里的隐性成本与部署后遗症
1.1 选2核4G还是2核2G,先算一笔JVM内存账
很多教程喜欢直接跳过服务器购买这一步,上来就教装环境,但以我这些年帮人收尾部署的经验来看,一半以上的“部署困难户”在买服务器那一刻就埋下了雷。
Java后端和静态网站完全不一样,它一旦跑起来就是一头内存怪兽。JVM默认的堆内存大小是物理内存的四分之一,也就是说一台2G内存的机器,你不做任何配置直接 java -jar,JVM会给自己划走512M。如果这台机器上还要跑MySQL、Nacos、Redis,内存分分钟爆给你看。
我见过太多人买了2C2G的入门机型,压缩包解压完系统就剩不到600M可用内存,然后各种 OutOfMemoryError 轮番轰炸。热搜词里那句 java: outofmemoryerror: insufficient memory 就是这么来的,而且是高频词。所以如果你准备部署的是Spring Boot单体应用 + MySQL,还没有别的中间件,2C4G是底线,2C2G大概率会让你在后半夜爬起来救服务。
另外有个特别容易踩的坑是阿里云的突发性能实例(t5/t6系列)。这类实例价格便宜很多,但它的CPU是有积分机制的。简单说,你买的时候那点价格对应的是一个基准CPU性能,平时的突发能力靠积分池撑着,积分用完CPU就会被压制到基准线,表现出的症状就是“为什么服务器突然慢得像蜗牛”。如果你的服务是7x24小时持续对外提供接口的,千万别图便宜选t系列,直接上通用型g系列或者计算型c系列,哪怕少买一年,也别让CPU成为系统的天花板。
1.2 系统镜像、安全组和登录方式,三项基础决定别做错
系统镜像这块,阿里云默认提供的选择很多,CentOS、Ubuntu、Debian、Alibaba Cloud Linux都有。我的建议是:CentOS 7虽然网上教程最多,但它已经停止维护,各大软件源对它的支持也在收缩,新环境就别往里跳了。现在阿里云主推的Alibaba Cloud Linux 3是个不错的选择,它向下兼容CentOS的使用习惯,yum命令照用,阿里云自己的优化和文档支持也最到位,遇到问题能搜到一手资料。Ubuntu 22.04/24.04也好,不过习惯了RHEL系老手切过去,apt和systemctl的差异要适应一阵子。
然后是安全组,这个我放到基础决定里说,因为它是新手第一大坑。阿里云ECS的端口放行分两层:云平台安全组和系统内部防火墙。安全组规则在阿里云控制台的ECS实例详情页里编辑,很多教程会在系统里帮你关firewalld,但如果你在安全组层面压根没放行端口,外部永远连不进来。正确的思路是:
- 安全组放行需要对外开放的端口(22、80、443、8080等)
- 系统防火墙保持开启,内部再限制一遍细粒度访问
- 3306这类数据库端口不要对全宇宙开放,只放行你自己的办公网IP或跳板机IP
登录方式上,我建议直接选密钥对。密码登录意味着服务器上有一个可以被爆破的入口,而密钥登录安全性高得多。密钥对的私钥文件保存好,丢了只能通过控制台重置,那个体验我不想再经历第二次。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java运行环境:JDK版本选择与JVM参数调优基础
2.1 不再纠结OpenJDK还是Oracle JDK,版本和源才是关键
服务器上装Java,我现在的做法是无脑OpenJDK。Oracle JDK的许可条款一变再变,而OpenJDK在服务器部署场景下和它的行为差异几乎可以忽略。
安装时优先用系统的包管理器,不要手动解压tar.gz。以Alibaba Cloud Linux / CentOS为例:
bash复制# 安装Java 8
sudo yum install -y java-1.8.0-openjdk-devel
# 或者安装Java 17
sudo yum install -y java-17-openjdk-devel
如果系统源里没有,可以先将yum源替换成阿里云镜像源,速度会明显提升。安装完之后,有个细节很多人会忽略:java -version 显示的版本不一定是你刚装的版本。因为系统里可能自带了一个旧OpenJDK,/usr/bin/java 指向的是旧的那个。这时候用 alternatives --config java 手动切换一下,或者更彻底一点,在 /etc/profile 里显式设置 JAVA_HOME 再重新登录会话。
bash复制export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
JDK版本选8还是17,取决于项目本身。老项目用8稳,新项目建议17或21,Spring Boot 3.x要求JDK 17起步,这个没得选。有一个小提醒:即使你用JDK 8,也尽量用8u202之后的版本,因为之后的版本经历了多次安全修复和企业级特性更新,线上环境别用太旧的build。
2.2 JVM参数:2G内存的机器怎么设置才不冤枉
很多开发者的习惯是本地IDE里点击运行,从不关心JVM参数,好,到了服务器上直接裸跑,结果就遇到了 insufficient memory。这里有两个层面要搞清楚:
第一层是操作系统层面的物理内存不足。一台2G的机器,系统本身占掉500M左右,MySQL如果占400M,Nacos如果单独部署再占300M,留给Java的物理空间可能只有7
