代码层优化是内存优化的基础,核心是减少不必要的对象创建和提升内存使用效率。
StringBuilder代替String的+=操作,可减少大量临时String对象的生成(如循环中拼接100个数字,StringBuilder仅创建1个对象,而String会创建100+中间对象)。Integer、Double)是对象,会占用更多内存(每个对象包含对象头、引用等开销)。例如,用int代替Integer存储数值,可减少内存占用约16字节/对象(64位JVM)。Map)存储已计算的结果,避免重复计算。例如,斐波那契数列计算中,用HashMap缓存已计算的fib(n)值,可将时间复杂度从O(2^n)降低到O(n)。不同数据结构的内存占用和性能差异大,需根据场景选择:
ArrayList<int[]>、HashMap<String, int[]>等集合,可直接存储基本类型数组,避免自动装箱带来的内存开销(如ArrayList<Integer>每个元素是Integer对象,比int[]多占用约16字节/元素)。LinkedList(链表结构,插入/删除时间复杂度O(1));ArrayList(数组结构,查询时间复杂度O(1));HashMap(哈希表,查询时间复杂度O(1)),若需有序则用TreeMap(红黑树,查询时间复杂度O(log n))。new ArrayList<>(1000)),避免默认初始容量(通常10)导致的多次扩容(每次扩容需复制元素,增加内存和时间开销)。JVM堆内存是对象存储的核心区域,合理配置可减少GC次数和停顿时间:
-Xms(初始堆)和-Xmx(最大堆)参数将两者设为相同值(如-Xms4g -Xmx4g),避免堆内存动态扩展带来的性能开销(扩展时需复制对象,增加GC时间)。-XX:NewRatio调整(如-XX:NewRatio=2表示年轻代:老年代=1:2)。年轻代过小会导致频繁Minor GC(复制算法,停顿时间短但频率高),过大则会减少老年代空间,引发更耗时的Full GC(标记-清除/整理算法,停顿时间长)。-XX:SurvivorRatio调整Eden区与Survivor区的比例(如-XX:SurvivorRatio=8表示Eden:Survivor=8:1:1)。Survivor区用于存放Minor GC后存活的对象,比例过小会导致对象过早晋升老年代,增大老年代压力。垃圾回收器(GC)的选择直接影响内存回收效率和停顿时间:
-XX:+UseParallelGC),采用多线程并行回收,适合后台计算、批处理等吞吐量优先的应用(如大数据分析)。可通过-XX:ParallelGCThreads设置线程数(通常为CPU核数的1/4~1/2)。-XX:+UseG1GC),将堆划分为多个Region(默认16MB~32MB),可预测停顿时间(通过-XX:MaxGCPauseMillis设置,如200ms),适合Web应用、支付系统等对延迟敏感的场景。G1还支持并发标记和整理,减少内存碎片。-XX:+UseConcMarkSweepGC),采用“标记-清除”算法,停顿时间短,但会产生内存碎片(可通过-XX:+UseCMSCompactAtFullCollection开启压缩,-XX:CMSFullGCsBeforeCompaction设置压缩频率,如每3次Full GC压缩一次)。内存泄漏会导致堆内存持续增长,最终引发OutOfMemoryError,需及时释放无用对象:
null(如obj = null),帮助GC更快回收。WeakReference(弱引用,GC时直接回收)或SoftReference(软引用,内存不足时回收)。例如,缓存中用WeakHashMap存储数据,当内存不足时,GC会自动回收这些数据。jmap -dump:format=b,file=heapdump.hprof <pid>生成),查找占用内存大的对象(如byte[]、ArrayList),定位泄漏根源(如未关闭的流、静态集合中的对象)。StringBuilder),用对象池(如commons-pool、自定义ObjectPool)复用对象,减少创建和销毁的开销。例如,自定义ObjectPool通过ConcurrentHashMap缓存对象,get()方法获取对象,release()方法归还对象。MappedByteBuffer(内存映射文件)将文件映射到内存,减少I/O操作(如RandomAccessFile+FileChannel+map方法)。内存映射文件直接操作内存,比传统I/O快得多,且不会占用过多堆内存。-Xss参数设置(默认1MB),高并发场景可减小到256k或512k(如-Xss256k),节省内存(每个线程栈占用内存减少)。但需注意,栈过小会导致StackOverflowError(如递归过深)。免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。