JavaGCJVM2026Java
JVM
Heap () Young Generation Old Generation Eden S0 S1 Non-Heap () Metaspace Code Cache JIT Cache public class ObjectAllocation { public static void main(String[] args) { // Eden Object small = new Object(); // // -XX:PretenureSizeThreshold byte[] largeArray = new byte[10 * 1024 * 1024]; // 10MB // // MaxTenuringThreshold }}2026GC
| G1 | <10ms | <64GB | ||
| ZGC | <1ms | >64GB | ||
| Shenandoah | <1ms | |||
| Parallel | - |
G1
# G1java -server \ -Xms4g -Xmx4g \ # -XX:+UseG1GC \ # G1 -XX:MaxGCPauseMillis=200 \ # -XX:G1HeapRegionSize=4m \ # Region -XX:InitiatingHeapOccupancyPercent=45 \ # GC -XX:G1ReservePercent=10 \ # -XX:+ParallelRefProcEnabled \ # -XX:MaxTenuringThreshold=15 \ # -XX:+UnlockExperimentalVMOptions \ -XX:G1MixedGCLiveThresholdPercent=85 \ -XX:G1HeapWastePercent=5 \ -jar application.jarZGC
# ZGCjava -server \ -Xms32g -Xmx32g \ -XX:+UseZGC \ -XX:MaxGCPauseMillis=1 \ -XX:+ZGenerational \ # ZGC -XX:+UnlockExperimentalVMOptions \ -jar application.jar1.
// async-profiler// java -XX:+ProfilerEnabled \ -XX:ProfilerPort=9999 \ -jar application.jar// async-profiler.sh -d 60 \ -f profile.html \ -e cpu \ pid2. GC
# GC-XX:+PrintGCDetails \-XX:+PrintGCDateStamps \-Xloggc:/var/log/gc.log \-XX:+UseGCLogFileRotation \-XX:GCLogFileSize=100M \-XX:NumberOfGCLogFiles=53. Arthas
# Arthasjava -jar arthas-boot.jar# dashboard# trace com.example.Service processOrder# thread -n 5# profiler startprofiler stop --format html1.
// public String buildQuery(List<String> params) { String result = ""; for (String param : params) { result += param + "&"; } return result;}// - StringBuilderpublic String buildQuery(List<String> params) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < params.size(); i++) { sb.append(params.get(i)); if (i < params.size() - 1) { sb.append("&"); } } return sb.toString();}// - JDK 11+ String.joinpublic String buildQuery(List<String> params) { return String.join("&", params);}2.
// List<String> list = new ArrayList<>();for (Item item : items) { list.add(item.getName());}// List<String> list = new ArrayList<>(items.size());// StreamList<String> names = items.parallelStream() .map(Item::getName) .filter(name -> name != null) .collect(Collectors.toList());3.
// Guava CacheLoadingCache<String, User> userCache = CacheBuilder.newBuilder() .maximumSize(10000) .expireAfterWrite(10, TimeUnit.MINUTES) .recordStats() .build(new CacheLoader<String, User>() { @Override public User load(String userId) { return userService.findById(userId); } });// public User getUser(String userId) { try { return userCache.get(userId); } catch (ExecutionException e) { throw new RuntimeException(e); }}1. Loom
Java 21+
// - public CompletableFuture<String> fetchAll(List<URL> urls) { List<CompletableFuture<String>> futures = urls.stream() .map(url -> CompletableFuture.supplyAsync(() -> fetch(url))) .collect(Collectors.toList()); return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) .thenApply(v -> futures.stream() .map(CompletableFuture::join) .collect(Collectors.joining()));}// - public String fetchAllVirtual(List<URL> urls) throws InterruptedException { try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { List<Future<String>> futures = urls.stream() .map(url -> executor.submit(() -> fetch(url))) .collect(Collectors.toList()); StringBuilder result = new StringBuilder(); for (Future<String> future : futures) { result.append(future.get()).append("\n"); } return result.toString(); }}2. CAS
// Atomicpublic class Counter { private final AtomicLong count = new AtomicLong(0); public void increment() { count.incrementAndGet(); } public long get() { return count.get(); }}// LongAdderpublic class HighConcurrencyCounter { private final LongAdder count = new LongAdder(); public void increment() { count.increment(); } public long get() { return count.sum(); }}1.
// HikariCPHikariConfig config = new HikariConfig();config.setMaximumPoolSize(20); // config.setMinimumIdle(5); // config.setConnectionTimeout(30000); // (ms)config.setIdleTimeout(600000); // (ms)config.setMaxLifetime(1800000); // (ms)config.setConnectionTestQuery("SELECT 1");config.setPoolName("AppPool");HikariDataSource dataSource = new HikariDataSource(config);2. MyBatis Plus
// IPage<User> page = new Page<>(1, 20);page = userMapper.selectPage(page, new LambdaQueryWrapper<User>() .eq(User::getStatus, 1) .orderByDesc(User::getCreateTime) .select(User::getId, User::getName, User::getEmail));// N+1List<User> users = userMapper.selectList( new LambdaQueryWrapper<User>() .inSql(User::getId, "SELECT user_id FROM orders WHERE status = 'PAID'"));// userService.saveBatch(userList, 500); // 500checklist
JVM
- [ ] -Xms == -Xmx
- [ ] GC
- [ ] GCFull GC
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ] N+1
- [ ]
JavaJVM2026ZGCJava