client 与 server
Created|Updated|Java
|Word Count:168|Reading Time:1mins|Post Views:
client 模式
默认的jit编译器,c1。
默认的gc:serial-serial old。
需要更短的启动时间和初始堆大小,能做更保守的优化。
默认-Xms是1M,-Xmx是64M。
适合 GUI 程序。
server 模式
默认的jit编译器,c2。
默认的gc:ps-serial old即 PS MarkSweep(可以启用parallel old)。
需要更长的启动时间和更大的堆大小,能够做更有深度的优化。
默认-Xms是128M,-Xmx是1024M。
适合长时间运转的程序。
64 位JVM#
在64位 JVM 上有个 -d64 的模式,实际上就是禁止client模式单独启动,只允许server模式或者混合编译模式启动的模式。
Author: magicliang
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2026-01-24
Java 线程池笔记
从执行器到线程池(from executor interface to thread pool implementation) Pooling is the grouping together of resources (assets, equipment, personnel, effort, etc.) for the purposes of maximizing advantage or minimizing risk to the users. The term is used in finance, computing and equipment management. ——wikipedia “池化”思想不仅仅能应用在计算机领域,在金融、设备、人员管理、工作管理等领域也有相关的应用。 在计算机领域中的表现为:统一管理IT资源,包括服务器、存储、和网络资源等等。通过共享资源,使用户在低投入中获益。除去线程池,还有其他比较典型的几种使用策略包括: 内存池(Memory Pooling):预先申请内存,提升申请内存速度,减少内存碎片。 连接池(Connection Poo...
2026-05-21
进程启动期的静默故障:JVM 与 Node.js 的调试方法论
很多人都遇到过这种场景:一个 JVM 进程因为 -Xmx 写错了一个字符,启动起来就死掉,控制台一行日志都没有;一个 Node.js CLI 比如 opencode 在前台 hang 住,光标不闪,也不退出;一个 Spring Boot 服务被 systemd 拉起来,systemctl status 显示 running,但端口永远不开。stderr 看不到、源码也没有,只能反复重启。 这类问题的共同点不是程序"出 bug",而是进程在"出第一行日志"之前就已经失败或卡住。常规的"看日志找异常"那一套这时候没东西可看。需要的是另一类方法论:把进程当黑盒,从外部撬开它的状态。 一、先把"看不到日志"分成四种情况 把"启动期黑盒"展开来看,至少是四种性质完全不同的故障。混在一起调,方向就错了。 类别 特征 进程状态 主要工具方向 A. crash 静默 进程已经退出,但没看到任何 stderr 不存在 找输出去向;看 OS / runtime 留下的尸检文件 B....

2018-10-22
JDWP 与远程调试
JDWP(Java Debug Wire Protocol),它提供了调试器和目标 JVM (target vm)之间的调试协议。 在 target vm 启动时,增加这个 JAVA_OPTS: 1JAVA_OPTS="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=26310" 在服务器端,增加 remote debuging 的时候使用如下配置: 12345678# Java 9 以上-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000# Java 5-8-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000# Java 1.4.x -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,addre...

2026-01-18
无锁队列
Java 一读一写(SPSC):Memory Barrier + Volatile 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657/** * Single-Producer Single-Consumer (SPSC) 无锁环形队列。 * * <p>原理说明: * - 仅允许一个线程调用 {@code offer()},一个线程调用 {@code poll()}。 * - 由于没有写竞争,无需 CAS;只需保证写操作对消费者可见。 * - 使用两个 volatile 索引(head/tail)建立 happens-before 关系: * 生产者写入元素 → volatile 写 tail → 消费者 volatile 读 tail → 读取元素。 * - 这本质上利用了 Java 内存模型中的“volatile 写-读”内存屏障(StoreLoad), * ...
2021-07-19
如何实现正确的微基准测试
原问题 FROM:《How do I write a correct micro-benchmark in Java?》 Tips about writing micro benchmarks from the creators of Java HotSpot: Rule 0: Read a reputable paper on JVMs and micro-benchmarking. A good one is Brian Goetz, 2005. Do not expect too much from micro-benchmarks; they measure only a limited range of JVM performance characteristics. Rule 1: Always include a warmup phase which runs your test kernel all the way through, enough to trigger all initializations and compilations before timi...
2020-03-08
JMX 深度历险
JMX 常见指标 JVM 指标 系统指标 System 相关指标 描述 system.load.average 系统load,如果是docker,此指标收集的物理机的load cpu.system.load.percent 系统所有进程占用cpu的百分比 cpu.jvm.load.percent jvm占用cpu的百分比 system.process.used.phyical.memory 系统使用的物理内存 system.process.used.swap.size 系统使用的swap内存 JVM 内存指标 JVM相关指标 描述 jvm.gc.count GC的次数 jvm.gc.time GC的时间,单位毫秒 jvm.younggc.count 年轻代GC的次数 ,包括的GC算法(Copy,ParNew,PS Scavenge,G1 Young Generation) jvm.younggc.time 年轻代GC的时间,单位毫秒 jvm.fullgc.count 年老代GC的次数,包括的GC算法 jvm.f...
