p.p1 { margin: 0; -webkit-hyphens: auto; font: 16px Arial; color: rgba(68, 68, 68, 1); -webkit-text-stroke: #444444 }
p.p2 { margin: 0; -webkit-hyphens: auto; font: 16px Arial; color: rgba(68, 68, 68, 1); -webkit-text-stroke: #444444; background-color: rgba(249, 249, 249, 1) }
span.s1 { font-kerning: none }

当你在网上兴冲冲找到一个可优化的参数时,先用-XX: +PrintFlagsFinal看看,它可能已经默认打开了,再找到一个,还是默认打开了...

JDK7与JDK8,甚至JDK7中的不同版本,有些参数值都不一样,所以不要轻信网上任何文章,一切以生产环境同版本的JDK打出来的为准。

经常以类似下面的语句去查看参数,偷懒不起应用,用-version代替。有些参数设置后会影响其他参数,所以查看时也把它带上。

java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads

笔者环境打印:

java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
uintx ParallelGCThreads = 4 {product}
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

p.p1 { margin: 0; -webkit-hyphens: auto; font: 19px Arial; color: rgba(172, 30, 6, 1); -webkit-text-stroke: #ac1e06 }
p.p2 { margin: 0; -webkit-hyphens: auto; font: 16px Arial; color: rgba(68, 68, 68, 1); -webkit-text-stroke: #444444 }
span.s1 { font-kerning: none }
span.s2 { font-kerning: none; color: rgba(172, 30, 6, 1); -webkit-text-stroke: 0px #ac1e06 }
span.s3 { font: 16px "Courier New"; font-kerning: none }

1.1 取消偏向锁 -XX:-UseBiasedLocking

JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它的线程,取消同步块上的synchronized原语。如果始终只有一条线程在访问它,就成功略过同步操作以获得性能提升。

但一旦有第二条线程访问这把锁,JVM就要撤销偏向锁恢复到未锁定线程的状态,详见 JVM的Stop The World,安全点,黑暗的地底世界, 可以看到不少RevokeBiasd的纪录,像GC一样,会Stop The World的干活,虽然只是很短很短的停顿,但对于多线程并发的应用,取消掉它反而有性能的提升和延时的极微的缩短,所以Cassandra就取消了它。

1.2 -XX:AutoBoxCacheMax=20000

Integer i = 3;这语句有着 int自动装箱成Integer的过程,JDK默认只缓存 -128 ~ +127的int 和 long,超出范围的数字就要即时构建新的Integer对象。设为20000后,我们应用的QPS从48,000提升到50,000,足足4%的影响。详见Java Integer(-128~127)值的==和equals比较产生的思考

1.3 启动时访问并置零内存页面-XX:+AlwaysPreTouch

启动时就把参数里说好了的内存全部舔一遍,可能令得启动时慢上一点,但后面访问时会更流畅,比如页面会连续分配,比如不会在晋升新生代到老生代时才去访问页面使得GC停顿时间加长。不过这选项对大堆才会更有感觉一点。

1.4 -XX:+PerfDisableSharedMem

Cassandra家的一个参数,一直没留意,直到发生高IO时的JVM停顿。原来JVM经常会默默的在/tmp/hperf 目录写上一点statistics数据,如果刚好遇到PageCache刷盘,把文件阻塞了,就不能结束这个Stop the World的安全点了。用此参数可以禁止JVM写statistics数据,代价是jps, jstat 用不了,只能用JMX取数据。有时用JMX取新生代老生代使用百分比还真没jstat方便。详见The Four Month Bug: JVM statistics cause garbage collection pauses

1.5 -Djava.security.egd=file:/dev/./urandom

此江湖偏方原用于Tomcat显式使用SHA1PRNG算法时,初始因子从/dev/random读取导致堵塞。而使用此设置后,额外效果是默认的SecureRandom算法也变成SHA1了。 SHA1PRNG 比 NativePRNG消耗小一半,synchronized的代码少一半,所以没特殊安全要求的话建议用SHA1。详见 SecureRandom的江湖偏方与真实效果

最新文章

  1. 安卓Design包之AppBar和Toolbar的联用
  2. MSSQL 多行合并为一行
  3. 浅析css布局模型1
  4. SQL server 视图、范式
  5. MoSCoW Method
  6. Floyd-Warshall算法,简称Floyd算法
  7. 在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结
  8. 证据对抗、证据链标准 z
  9. Why String is immutable in Java ?--reference
  10. angularjs ios title不能修改的bug的解决方法
  11. WebBrowser.ExecWB方法
  12. javascript 入门之简单换肤效果
  13. c# 服务程序重启自身
  14. mysql varchar类型转换int类型找出最大值
  15. GridView七十二绝技-大全(收藏版)(转至别人博客)
  16. [HDU3247]Resource Archiver
  17. Git版本库管理
  18. MP实战系列(四)之DAO讲解
  19. Einbahnstrasse HDU2923
  20. 简单的topK问题

热门文章

  1. MapReduce怎么优雅地实现全局排序
  2. Spring框架之AOP源码完全解析
  3. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识
  4. PyQt学习随笔:使用PyCharm+PyQt开发遇到的坑
  5. Python学习随笔:使用xlwings读取和操作Execl文件
  6. C#使用ML.Net完成人工智能预测
  7. 半夜删你代码队 Day4冲刺
  8. AcWing 345. 牛站 Cow Relays
  9. Java8的Lambda表达式,你会不?
  10. Day5 - 06 函数的参数-命名关键字参数