代码是资源占用的源头,需优先排查死循环、重复创建对象、大循环内频繁操作等问题。例如:
new
操作),尽量复用对象;StringBuffer
代替String
进行字符串拼接(String
的+
操作会隐式创建多个临时对象);synchronized
),仅在多线程竞争时使用,避免锁竞争导致的CPU占用过高。Java编译(如javac
)或运行时,JVM内存设置不合理(如-Xmx
过大)会导致内存占用过高,甚至触发频繁GC(垃圾回收)。需根据机器配置调整:
-Xms
(初始堆大小)和-Xmx
(最大堆大小)限制堆内存,例如-Xms512m -Xmx1024m
(初始512MB,最大1GB),避免占用全部物理内存;-XX:NewRatio
设置新生代与老年代的比例(如-XX:NewRatio=2
表示新生代占堆的1/3),适合编译这类短生命周期对象较多的场景;-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log
,通过日志分析GC频率和耗时,进一步优化内存配置。javac
,且支持并行编译(如Maven的-T
参数:mvn -T 1C clean compile
,1C
表示使用1核CPU);javac
本身支持-J
参数传递JVM选项,例如javac -J-Xmx512m -J-XX:ParallelGCThreads=4
(限制JVM内存并启用4线程GC),或通过构建工具配置并行编译(如Gradle的org.gradle.parallel=true
)。通过系统工具限制编译进程的CPU和内存占用,避免影响其他任务:
nice
调整进程优先级:nice -n 10 javac YourClass.java
(nice
值越大,优先级越低,减少对CPU的占用);cpulimit
限制CPU使用率:cpulimit -l 50 -p <PID>
(限制进程PID的CPU使用率不超过50%);ulimit
限制内存:ulimit -v 1048576
(限制进程虚拟内存为1GB,超过则终止)。使用系统或JVM工具定位具体占用资源的线程或方法:
top
(查看CPU/内存占用排名)、htop
(更直观的进程监控)命令,找到占用高的Java进程;jstack <PID>
查看线程堆栈,分析是否有线程死锁或长时间占用CPU;使用jmap -histo <PID>
查看对象分布,找出占用内存大的对象;mvn compile -Dmaven.compile.fork=true
(启用fork模式,隔离编译进程),Gradle可使用gradle build --profile
生成性能报告。distcc
(分布式C/C++编译器)或构建工具的分布式编译功能(如Gradle Enterprise),将编译任务分发到多台机器,减少单机的资源压力。