减少 Java 内存开销可以从代码层面、JVM 参数、数据结构选择、对象生命周期管理等多个角度入手。下面按实用性整理一份“可操作清单”。
new 对象ThreadPool、ByteBuffer 池)static final 常量代替重复创建// 不好
for (int i = 0; i < 10000; i++) {
String s = new String("abc");
}
// 好
String s = "abc";
| 场景 | 推荐 |
|---|---|
| 固定大小 | 数组 |
| 不需要线程安全 | ArrayList / HashMap |
| 大量基本类型 | TIntArrayList(Trove/Eclipse Collections) |
| 小集合 | Collections.emptyList() / List.of() |
避免:
Vector(同步开销)HashtableHashMap(扩容翻倍)// 内存小、速度快
int[] arr = new int[100000];
// 内存大(对象头 + 引用)
Integer[] arr = new Integer[100000];
+ 拼接(用 StringBuilder)char[] 或 ByteBufferStringBuilder sb = new StringBuilder();
sb.append(a).append(b);
-Xms512m -Xmx512m
避免:
-XX:+UseG1GC
-XX:+UseZGC
-XX:+UseCompressedOops
可显著减少对象内存占用。
static 持有大对象WeakReference / SoftReferenceLRU)WeakReference<byte[]> ref = new WeakReference<>(data);
常见原因:
Map 缓存Stream / ConnectionSerializable 小很多。ByteBuffer.allocateDirect(size);
适合:
jstatjmapjmap -histo:live pid
少创建对象、选对结构、控好生命周期、调好 JVM。
如果你愿意,可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。