JavaJVM

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.jar

ZGC

# ZGCjava -server \ -Xms32g -Xmx32g \ -XX:+UseZGC \ -XX:MaxGCPauseMillis=1 \ -XX:+ZGenerational \ # ZGC -XX:+UnlockExperimentalVMOptions \ -jar application.jar

1.

// async-profiler// java -XX:+ProfilerEnabled \ -XX:ProfilerPort=9999 \ -jar application.jar// async-profiler.sh -d 60 \ -f profile.html \ -e cpu \ pid

2. GC

# GC-XX:+PrintGCDetails \-XX:+PrintGCDateStamps \-Xloggc:/var/log/gc.log \-XX:+UseGCLogFileRotation \-XX:GCLogFileSize=100M \-XX:NumberOfGCLogFiles=5

3. Arthas

# Arthasjava -jar arthas-boot.jar# dashboard# trace com.example.Service processOrder# thread -n 5# profiler startprofiler stop --format html

1.

// 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); // 500

checklist

JVM

  • [ ] -Xms == -Xmx
  • [ ] GC
  • [ ] GCFull GC
  • [ ]

  • [ ]
  • [ ]
  • [ ]
  • [ ]

  • [ ]
  • [ ]
  • [ ] N+1
  • [ ]

JavaJVM2026ZGCJava