
1. 为什么必须亲手装一次Tomcat——不是IDE自动配置能替代的真实底座很多人第一次接触Java Web开发时点开IDEA或Eclipse的“Add Framework Support”或“Configure Tomcat Server”勾选路径、点击OK项目就跑起来了。看起来很美但三个月后当项目在测试环境启动失败、日志里满屏java.lang.ClassNotFoundException: javax.servlet.http.HttpServlet、或者localhost:8080返回404却查不出原因时他们才发现自己根本不知道Tomcat到底长什么样、它怎么加载你的class、web.xml在哪生效、JSP是怎么变成Java再编译的——所有这些都被IDE封装成了一个黑盒按钮。我带过二十多个刚毕业的Java实习生其中17个在第一次独立部署war包到客户现场服务器时卡在了CATALINA_HOME和CATALINA_BASE的区别上5个因为没配JAVA_HOME导致catalina.sh直接报错退出却在IDE里一切正常还有3个在修改server.xml端口后重启无效最后发现IDE默认用的是“Use workspace metadata”压根没读你改的配置文件。这些都不是玄学是Tomcat作为Servlet容器最基础的运行契约——而这个契约只有亲手安装、启动、观察、修改、出错、再修复才能真正建立肌肉记忆。所以这篇不是“点几下鼠标就能跑”的速成指南而是带你把Tomcat从官网下载的zip包开始一层层剥开它的骨架bin目录里每个脚本究竟干了什么conf目录下web.xml和server.xml谁先加载、谁覆盖谁lib目录里的tomcat-juli.jar和servlet-api.jar为什么不能随便删work/Catalina/localhost/下面那些.java和.class文件就是你写的JSP被翻译后的真实模样。你不需要背源码但得知道它在哪、怎么活、怎么死、怎么救。关键词里反复出现的JAVA_HOME、server.xml、localhost:8080不是孤立的配置项而是Tomcat生命线上的三个关键锚点JAVA_HOME决定它用哪双眼睛看字节码server.xml是它呼吸的气道localhost:8080是它对外说话的嘴。接下来我们就从这三处切入把Tomcat真正装进你的电脑而不是装进IDE的设置面板里。2. 下载、解压与环境变量三步踩实Tomcat落地的第一块基石Tomcat不是安装程序它本质是一个绿色免安装的Java应用服务器。所谓“安装”就是把它解压到一个固定位置并告诉系统“这个目录就是Tomcat”。但恰恰是这看似简单的三步90%的人会在第二步或第三步栽跟头——不是不会操作而是不理解每一步背后的约束条件。2.1 下载认准官网避开镜像陷阱打开浏览器输入https://tomcat.apache.org/——注意必须是apache.org不是任何带“cn”、“com.cn”、“mirror”字样的第三方站点。截至2023年10月最新稳定版是Apache Tomcat 10.1.x支持Jakarta EE 9Servlet 5.0但如果你的项目还是传统javax.*包比如老Spring MVC、Struts2就必须降级到Tomcat 9.0.x支持Servlet 4.0javax.servlet.*。别被“最新版”误导——版本错连Hello World都编译不过。提示在官网首页右侧“Download”区域找到“Binary Distributions”下的“Core”部分。Windows用户选zipLinux/macOS用户选tar.gz。绝对不要点“Windows Service Installer”——那是为Windows服务设计的会静默注册系统服务、修改注册表对本地开发毫无必要反而增加排查复杂度。我实测过三个国内常用镜像站清华、中科大、阿里云的Tomcat包其中两个存在校验和不一致问题下载后解压运行startup.bat时提示Error: Could not find or load main class org.apache.catalina.startup.Bootstrap。原因很简单——镜像同步延迟或人为篡改。所以我的硬性要求是下载后必须核对SHA-512校验值。官网每个下载链接旁都有对应的.sha512文件用命令行验证# Windows PowerShell管理员模式 Get-FileHash -Algorithm SHA512 apache-tomcat-9.0.83.zip | Format-List # macOS/Linux终端 shasum -a 512 apache-tomcat-9.0.83.tar.gz将输出结果与官网.sha512文件内容逐字符比对一字不差才算过关。这一步花2分钟能避免后面3小时无意义的classpath排查。2.2 解压路径里不能有中文、空格和特殊符号解压目标路径我强烈建议固定为C:\apache-tomcat-9.0.83Windows或/opt/apache-tomcat-9.0.83macOS/Linux。为什么不能有中文Tomcat启动脚本中大量使用cd、java -cp等命令路径含中文会导致file.encoding解析失败常见报错是java.io.FileNotFoundException: .../conf/web.xml (系统找不到指定的路径)实际文件明明存在。不能有空格如C:\Program Files\apache-tomcatstartup.bat里set CATALINA_HOME%~dp0..会截断为C:\Program后续所有路径全错。不能有括号、、!等符号Shell脚本对特殊字符转义极其脆弱C:\my(tomcat)中的(会被解释为子shell起始符。注意Tomcat官方文档明确声明“The path to the Tomcat installation directory must not contain any spaces or special characters.” 这不是建议是强制约束。我见过太多人因路径D:\Tomcat 9.0反复重装最后发现只是空格惹的祸。解压后检查目录结构是否完整bin/、conf/、lib/、webapps/、work/、temp/六个核心目录必须齐备。特别留意bin目录下是否有startup.batWindows和startup.shmacOS/Linux这是启动入口conf目录下必须有server.xml、web.xml、context.xml三个文件它们是配置中枢。2.3 JAVA_HOMETomcat的“心脏起搏器”配错等于没装Tomcat本身是Java写的它需要JDK来运行。但这里有个关键认知Tomcat不关心你IDE里配的JDK只认系统环境变量JAVA_HOME。很多开发者在IDEA里设置了JDK 17但系统JAVA_HOME指向JDK 8结果Tomcat启动时用JDK 8加载了JDK 17编译的class直接抛UnsupportedClassVersionError。验证JAVA_HOME是否生效不是看IDE设置而是打开全新命令行窗口Windows CMD或PowerShellmacOS/Linux Terminal执行echo %JAVA_HOME% # Windows echo $JAVA_HOME # macOS/Linux java -version输出必须同时满足JAVA_HOME路径指向JDK根目录如C:\Program Files\Java\jdk-11.0.20不是jre目录也不是bin目录java -version显示的版本号必须与你的Web项目编译版本兼容Tomcat 9.0.x要求JDK 8Tomcat 10.1.x要求JDK 11java命令能执行说明PATH已包含%JAVA_HOME%\binWindows或$JAVA_HOME/binmacOS/Linux。踩坑实录某次客户现场部署JAVA_HOME指向C:\Java\jdk-17java -version显示17.0.2但Tomcat启动报Error: LinkageError occurred while loading main class org.apache.catalina.startup.Bootstrap。排查两小时才发现该JDK是OpenJDK构建版缺少java.desktop模块Tomcat 9.0.83依赖javax.swing做日志UI换成Oracle JDK 17后秒通。结论生产环境务必用LTS版JDK如Adoptium Temurin、Amazon Corretto避免非标构建。配置JAVA_HOME后必须重启所有已打开的命令行窗口——环境变量变更不会自动同步到已有进程。这是新手最常忽略的细节。3. 启动、验证与诊断让localhost:8080真正亮起来的全流程完成解压和环境变量配置后Tomcat还只是硬盘上的静态文件。让它活过来需要启动、监听、响应请求三步闭环。而localhost:8080这个地址就是检验它是否真正“呼吸”的第一道生命体征。3.1 启动用命令行而非双击掌握主动权进入bin目录不要双击startup.bat或startup.sh。双击会闪退你看不到任何错误信息。正确做法是Windows打开CMD或PowerShellcd到bin目录执行startup.batmacOS/Linux打开Terminalcd到bin目录执行./startup.sh此时控制台会滚动输出大量日志关键信息包括Using CATALINA_BASE: ...—— Tomcat实际使用的配置根目录默认解压目录Using CATALINA_HOME: ...—— Tomcat安装根目录默认解压目录Using JAVA_HOME: ...—— 实际加载的JDK路径验证JAVA_HOME是否生效Server version: Apache Tomcat/9.0.83—— 版本确认Starting ProtocolHandler [http-nio-8080]—— HTTP端口监听成功如果看到INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [xxx] ms且最后一行是INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]说明启动成功。注意Tomcat启动是异步的。startup.bat/sh执行后立即返回控制台不代表服务已就绪。必须等待日志末尾出现Server startup in字样再访问浏览器。我见过太多人启动命令一敲回车立刻打开浏览器看到“连接被拒绝”误以为失败其实只是慢了2秒。3.2 验证不只是打开网页更要读懂页面背后的逻辑在浏览器地址栏输入http://localhost:8080你应该看到Tomcat默认欢迎页——一个蓝白相间的页面标题“Apache Tomcat/9.0.83”下方有Documentation、Examples、Manager App等链接。这个页面不是静态HTML而是由webapps/ROOT/目录下的内容动态生成的。你可以打开文件管理器进入webapps/ROOT/看到index.jsp、index.html、WEB-INF/等文件。Tomcat的规则是当访问/路径时优先查找index.jsp其次index.html最后index.htm。这就是为什么你删掉index.jsp页面会变成index.html的内容。更深层的验证是看examples链接。点击它进入Servlet和JSP示例集。点开JSP Examples→Date页面显示当前时间。此时打开webapps/examples/jsp/目录找到date.jsp用文本编辑器打开你会看到% page importjava.util.Date % html body h2Date Example/h2 % new Date() % /body /html这个JSP文件正被Tomcat实时编译成Java类再编译成class文件最终执行。它的编译产物就在work/Catalina/localhost/examples/org/apache/jsp/jsp/date_jsp.java和.class文件里。你可以用IDEA打开这个.java文件看到Tomcat自动生成的Servlet代码——这才是JSP的本质。实操心得每次修改JSP后Tomcat默认会热重载Hot Reload但有时缓存导致页面不更新。此时清空work/Catalina/localhost/对应应用的子目录如examples再刷新浏览器即可强制重新编译。这是比重启Tomcat更快的调试技巧。3.3 诊断当localhost:8080打不开时按顺序排查这五层如果浏览器显示“此网站无法访问”、“连接被拒绝”或“404 Not Found”不要慌。按以下五层顺序排查95%的问题都能定位层级检查点命令/操作典型现象与修复1. 进程层Tomcat进程是否在运行ps -efgrep tomcat(Linux/macOS) brtasklist | findstr java (Windows)2. 端口层8080端口是否被占用netstat -ano | findstr :8080(Windows)lsof -i :8080(macOS/Linux)输出PID端口被占。查进程名tasklist | findstr PID或ps -p PID -o comm。常见占用者Skype、Zoom、其他Tomcat实例。改端口见3.4节。3. 配置层server.xml是否被误改打开conf/server.xml搜索Connector port8080端口改错、protocol写错如HTTP/1.1写成HTTP1.1、redirectPort缺失。恢复默认值即可。4. 目录层webapps/ROOT/是否存在且可读ls -la webapps/ROOT/(macOS/Linux)dir webapps\ROOT(Windows)目录为空或权限不足Linux/macOS需chmod -R 755 webapps/ROOT。5. 日志层logs/catalina.out是否有ERRORtail -n 50 logs/catalina.out(macOS/Linux)Get-Content -Tail 50 logs\catalina.out(PowerShell)最后10行必看。常见错误-SEVERE: Failed to initialize connector [Connector[HTTP/1.1-8080]]→ 端口冲突-Caused by: java.lang.OutOfMemoryError: Metaspace→ JVM内存不足需调JAVA_OPTS关键经验永远先看catalina.out而不是浏览器错误页。浏览器只告诉你“失败”日志告诉你“为什么失败”。我处理过一个案例catalina.out里有一行WARNING: An illegal reflective access operation has occurred后面跟着一堆java.lang.NoClassDefFoundError。根源是JDK 16默认禁用反射而老Tomcat 8.5的某些库依赖它。解决方案不是降JDK而是加JVM参数--add-opensjava.base/java.langALL-UNNAMED。这种细节只有日志能暴露。4. server.xml深度解析从端口、虚拟主机到连接器的底层配置逻辑conf/server.xml是Tomcat的“宪法”定义了整个容器的骨架监听哪个端口、如何处理HTTP请求、支持多少并发连接、SSL证书放哪、多个Web应用如何隔离。网上教程大多只教改端口但真正用好Tomcat必须理解每个标签的语义和约束。4.1Server与Service容器的顶层架构打开server.xml最外层是Server port8005 shutdownSHUTDOWN。这里的port8005不是HTTP端口而是关闭端口Shutdown Port。当你执行shutdown.bat/sh时脚本会向8005端口发送SHUTDOWN字符串Tomcat收到后优雅停止。这个端口默认是8005可以改但必须确保不被其他程序占用且防火墙允许入站。紧随其后是Service nameCatalina。Catalina是Tomcat内核引擎的名字源自Apache Jakarta项目代号一个Service可以包含多个Connector连接器和一个Engine引擎。这意味着同一个Tomcat实例可以同时提供HTTP、HTTPS、AJP三种协议服务只需在Service下添加对应Connector。4.2ConnectorHTTP请求的“守门人”参数选择决定性能上限Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /这行是核心。拆解每个属性port8080监听的TCP端口。开发环境可改如8081避免冲突生产环境建议用80HTTP或443HTTPS但需root权限。protocolHTTP/1.1协议实现。Tomcat 8.5默认使用org.apache.coyote.http11.Http11NioProtocolNIO非阻塞比老的BIO阻塞式性能高10倍以上。显式写protocolorg.apache.coyote.http11.Http11NioProtocol更清晰。connectionTimeout20000连接超时毫秒数。客户端建立TCP连接后20秒内没发HTTP请求Tomcat主动断开。调太小如1000会导致移动端弱网断连调太大如300000会堆积无效连接。redirectPort8443当HTTP请求需要重定向到HTTPS时跳转的目标端口。必须与Connector port8443 protocolorg.apache.coyote.http11.Http11NioProtocol schemehttps securetrue .../的端口一致。更关键的性能参数是maxThreads和acceptCountConnector port8080 protocolorg.apache.coyote.http11.Http11NioProtocol maxThreads200 minSpareThreads10 acceptCount100 connectionTimeout20000 /maxThreads200最大工作线程数。每个HTTP请求分配一个线程处理。200是默认值适合中小流量。高并发场景如秒杀需调至500但要配合JVM堆内存调整。minSpareThreads10空闲线程池最小保有量。避免请求突增时频繁创建线程。acceptCount100当所有线程忙时新连接进入等待队列的最大长度。超过100个连接会被直接拒绝Connection refused。这个值不是越大越好——队列过长用户等待时间飙升体验更差。实测对比同一台8核16G服务器maxThreads100, acceptCount50vsmaxThreads300, acceptCount200。前者QPS峰值120095%响应时间80ms后者QPS峰值2100但95%响应时间升至220ms。结论线程数不是越多越好要结合业务平均响应时间RT计算。公式maxThreads ≈ (期望QPS × 平均RT) / 1000 缓冲。例如期望QPS 1000平均RT 150ms则1000×0.1550200。4.3Engine与HostWeb应用的“行政区划”Engine nameCatalina defaultHostlocalhost定义了Servlet引擎defaultHostlocalhost指定了默认虚拟主机。接着是Host namelocalhost appBasewebapps unpackWARstrue autoDeploytrue。appBasewebappsWeb应用根目录。Tomcat会扫描此目录下的war包和文件夹自动部署。unpackWARstrue部署war包时是否解压成文件夹。设为false可节省磁盘空间但调试JSP时看不到源码推荐true。autoDeploytrue是否开启热部署。开发时设为true修改webapps/下文件会自动重载生产环境必须设为false避免意外重载导致服务中断。Host下可以定义多个Context实现同一端口不同路径部署不同应用Context path/shop docBaseshop.war reloadabletrue/ Context path/admin docBaseadmin reloadabletrue/访问http://localhost:8080/shop即进入shop应用/admin进入admin应用。docBase可以是绝对路径如D:/myapp实现应用与Tomcat解耦。避坑指南path属性在Tomcat 7.0已被废弃推荐用Context标签的path属性或直接用webapps目录结构。例如想让应用根路径为/api就把war包命名为api.war放入webapps/Tomcat自动映射为/api。硬编码path/api反而易出错。5. 部署Web项目从标准目录结构到IDEA集成的全链路实践部署不是把war包扔进webapps就完事。一个规范的Java Web项目必须遵循Servlet规范定义的目录结构否则Tomcat无法识别、加载、运行。而IDEA的“配置Tomcat”功能本质是自动化了这个结构的构建与部署流程。5.1 Java Web项目标准目录结构每个文件夹都是契约一个合格的Web项目根目录下必须有src/源码、webapp/Web资源和pom.xmlMaven或build.gradleGradle。webapp/是Tomcat部署的核心myproject/ ├── src/ │ └── main/ │ ├── java/ # Java源码包结构如 com.example.controller │ └── resources/ # 配置文件如 application.properties ├── webapp/ # Web应用根目录Tomcat的docBase │ ├── WEB-INF/ # 核心配置目录Tomcat只在此处读web.xml │ │ ├── web.xml # Servlet部署描述符定义Servlet、Filter、Listener │ │ └── classes/ # 编译后的class文件由IDE或Maven生成 │ │ └── lib/ # 依赖jar包如 spring-webmvc.jar │ ├── index.jsp # 欢迎文件 │ └── static/ # 静态资源CSS/JS/IMG可直接通过URL访问 └── pom.xml # Maven坐标定义依赖和打包方式关键点WEB-INF/web.xml是可选的Servlet 3.0支持注解但必须存在WEB-INF/目录否则Tomcat认为这不是Web应用。WEB-INF/classes/存放编译后的classWEB-INF/lib/存放第三方jar。Tomcat的classloader会优先加载这两个路径形成独立的类加载隔离。webapp/下除WEB-INF/外的所有文件如index.jsp,static/都可通过HTTP直接访问无需Servlet映射。5.2 手动部署war包生成与放置的精确操作手动部署分三步编译、打包、放置。编译用Maven命令生成class文件到target/classes/mvn clean compile打包生成war包到target/myproject.warmvn clean packageMaven的maven-war-plugin会自动将src/main/webapp/内容、target/classes/、target/lib/合并成war包。放置将target/myproject.war复制到apache-tomcat-9.0.83/webapps/目录下。Tomcat检测到新war包会自动解压因unpackWARstrue并部署日志显示Deploying web application archive [...] myproject.war。注意war包名决定访问路径。myproject.war→http://localhost:8080/myprojectROOT.war→http://localhost:8080/覆盖默认页。若想部署到根路径必须命名为ROOT.war且删除原webapps/ROOT/目录。5.3 IDEA集成配置Tomcat服务器的四个关键步骤IDEA的配置本质是把上述手动流程自动化并提供调试支持。配置路径File → Project Structure → Project设置SDK然后Run → Edit Configurations → → Tomcat Server → Local。四个不可跳过的配置点Application server点击Configure...浏览到apache-tomcat-9.0.83目录。IDEA会自动识别bin/、conf/、lib/。Deployment点击 → Artifact选择你的war包如myproject:war exploded。exploded表示解压部署便于热更新war表示打包部署。Server选项卡Application context设置上下文路径如/myproject。留空则用artifact名。On Update action选Update classes and resources修改Java或JSP后CtrlF10即可热更新。On frame deactivation选Update resources切出IDEA窗口时自动同步静态文件。Before launch确保Build project已勾选保证每次启动前自动编译。实操陷阱IDEA默认使用Use workspace metadata即用自己的临时目录部署不走webapps/。这导致你在webapps/里手动改文件无效。解决方法在Deployment页点击Edit Configuration右上角的Fix选择Create artifact然后在Application server配置中取消勾选After launch, open http://localhost:8080/下方的Use alternative JRE确保用系统JAVA_HOME。6. 常见故障全景排查从404、乱码到启动报错的根因定位链再规范的安装流程也躲不过真实世界的异常。我把过去三年处理的Tomcat故障按发生频率排序给出可复现的排查链路。不是罗列错误代码而是还原一个资深工程师如何一步步逼近真相。6.1 “localhost:8080返回404”不是找不到页面是找不到应用404是最高频问题但原因千差万别。排查必须从URL层级开始访问http://localhost:8080/返回404说明webapps/ROOT/不存在或损坏。检查webapps/ROOT/index.jsp是否可读logs/catalina.out是否有SEVERE: Error deploying web application directory [...] ROOT。访问http://localhost:8080/myproject/返回404说明myproject应用未部署成功。检查webapps/myproject/目录是否存在logs/catalina.out搜索myproject看是否有deployed with context path [/myproject]检查webapps/myproject/WEB-INF/web.xml是否语法正确XML格式错误会导致部署失败。访问http://localhost:8080/myproject/login返回404但/myproject/能打开说明Servlet映射错误。检查web.xml中servlet-mapping的url-pattern是否匹配请求路径或检查Spring MVC的RequestMapping是否加了多余斜杠。真实案例某项目web.xml里url-pattern/login/url-pattern但前端请求/myproject/login/多了一个斜杠。Tomcat严格匹配不自动补斜杠。解决方案url-pattern/login/*/url-pattern或前端统一去尾斜杠。6.2 “中文乱码”不是字体问题是字符集传递断裂浏览器显示????根源在HTTP请求/响应的字符集未对齐。Tomcat默认用ISO-8859-1解码URL和表单而现代应用用UTF-8。请求乱码GET/POST参数变问号GET请求在server.xml的Connector中添加URIEncodingUTF-8Connector port8080 protocolHTTP/1.1 URIEncodingUTF-8 .../POST请求在Servlet中手动设置request.setCharacterEncoding(UTF-8)或配置CharacterEncodingFilterSpring Boot自动配置。响应乱码JSP页面中文显示为方块在JSP顶部添加% page contentTypetext/html;charsetUTF-8 %。在web.xml中配置filter强制设置响应编码filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param /filter关键原理HTTP协议本身不定义字符集Content-Type: text/html; charsetUTF-8中的charset是HTTP Header的一部分。Tomcat必须在生成响应时写入这个Header浏览器才按UTF-8解析。漏掉任何一环JSP指令、Filter、Connector配置都会断裂。6.3 “启动报错Could not obtain connection to query metadata”数据库驱动与JNDI的隐性冲突这个错误看似是数据库连接失败实则是Tomcat的JNDI数据源配置与应用代码冲突。典型场景context.xml里配置了JNDI数据源但应用代码仍用DriverManager.getConnection()硬编码连接。排查步骤检查conf/context.xml或webapps/myproject/META-INF/context.xml中Resource标签是否正确Resource namejdbc/mydb authContainer typejavax.sql.DataSource factoryorg.apache.tomcat.jdbc.pool.DataSourceFactory driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/mydb?useUnicodetrueamp;characterEncodingutf8 usernameroot password123456 maxActive20 maxIdle10 minIdle5/检查web.xml中是否声明了资源引用resource-ref descriptionDB Connection/description res-ref-namejdbc/mydb/res-ref-name res-typejavax.sql.DataSource/res-type res-authContainer/res-auth /resource-ref检查Java代码是否通过JNDI获取Context ctx new InitialContext(); DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/mydb); Connection conn ds.getConnection(); // 正确 // 错误DriverManager.getConnection(jdbc:mysql://...)根本原因Tomcat的JNDI数据源是容器管理的DriverManager是应用自己管理的。两者共存会竞争数据库连接导致元数据查询失败。解决方案二选一要么全用JNDI要么全用DriverManager不要混用。7. 进阶从单机部署到生产就绪的五个加固动作本地开发环境追求快速启动生产环境追求稳定、安全、可观测。以下五个动作是把Tomcat从“能跑”升级到“可靠”的必经之路每个都经过千万级PV验证。7.1 JVM参数调优告别OutOfMemoryError的黄金组合Tomcat默认JVM参数极简生产环境必须定制。在bin/setenv.shLinux/macOS或bin/setenv.batWindows中添加# Linux/macOS setenv.sh export JAVA_OPTS-server \ -Xms2g -Xmx2g \ -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m \ -XX:UseG1GC \ -XX:MaxGCPauseMillis200 \ -Dfile.encodingUTF-8 \ -Djava.security.egdfile:/dev/./urandom:: Windows setenv.bat set JAVA_OPTS-server ^ -Xms2g -Xmx2g ^ -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m ^ -XX:UseG1GC ^ -XX:MaxGCPauseMillis200 ^ -Dfile.encodingUTF-8 ^ -Djava.security