1. -XX:+DisableExplicitGC

Java在实现RMI Server的时候会通过定时的调System.gc来强制做GC(即使程序里没用到RMI也会被启动),这个动作非常烦人,另外也是为了避免应用代码上显式去调用System.gc导致一些没必要的GC动作产生,所以当时就直接加上了这个参数。

现在来看,这个参数有个挺大的问题是,Direct ByteBuffer所占用的内存以及FileChannel.map所占用的内存当达到了他们的最大阈值时,需要依赖调用System.gc来强制释放下,如果加上了这个启动参数,就意味着这个强制的释放就无效了,这会导致的一个问题是,当old gen还没到达触发full gc/cms gc的条件,而堆外的Direct ByteBuffer/FileChannel.map占用的空间又超过了它们的最大阈值时,就会直接导致OOM,而这种情况下很有可能其实是可以借助显式调用System.gc来释放出足够的空间,不过话说我仍然觉得这是JDK设计上应该改进的一点,不应该在这个时候需要依赖System.gc来管理堆外的空间,大家可以翻下FileChannel.map的代码就会发现那里在等待System.gc执行的结果是写S的等待100ms,事实上很少有full gc/cms gc可以在100ms完成。

不过鉴于上面的状况,如果应用里有使用到不少Direct ByteBuffer或FileChannel.map的话,建议还是不要开启-XX:+DisableExplicitGC,如果是cms gc的,还是改为加上这个参数-XX:+ExplicitGCInvokesConcurrent,另外如果有RMI Server这种定时GC影响的,再调整下-Dsun.rmi.dgc.client.gcInterval和-Dsun.rmi.dgc.server.gcInterval这两个时间吧,时间单位是ms,也可以设置为Long.MAX_VALUE。

2. 缺少-XX:+UseCMSInitiatingOccupancyOnly

由于我们的Java应用的heap基本都是大于4G的,所以都是用的CMS,当时我在写启动参数的时候一直犹豫要不要加上-XX:+UseCMSInitiatingOccupancyOnly这个参数,一犹豫就没加,但事实上后来碰到了不少应用由于JVM自行触发CMS GC的机制导致CMS GC频繁,所以建议用CMS GC的场景下还是加上这个参数更稳妥。

3. -XX:MaxDirectMemorySize

话说在写启动参数的时候我都压根不知道这参数(要知道Java到底有哪些启动参数可用,以及默认值是多少,最靠谱的方法是在启动参数上加-XX:+PrintFlagsFinal或用jinfo -flags [pid]来查看),后来是由于有一次出现了有应用物理内存被耗光,排查的时候才发现是Direct ByteBuffer这块默认的大小是heap size,所以在有些情况下可能会出现Direct ByteBuffer这里占用了大量的空间,但heap这边又还不到触发Full gc/CMS gc的条件,就会有可能导致物理内存被耗光。

因此对于远程交互比较多的应用,建议还是加上这个参数,合理控制大小,不要让heap size+Direct Memory Size就把物理内存给耗光了。

ps: 关于Java常见问题的排查方法,重新专门写了一个PPT,涵盖了以下几种常见的Java问题的排查方法:

1. 类加载问题,例如NoSuchMethodException;

2. 内存问题,例如各种OOM;

3. 应用无响应问题,例如http访问后返回499;

4. CPU利用率问题,例如us耗尽;

5. Java进程退出问题。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

JVM8.0之后web推荐的配置:

JAVA_OPTS='-server -Xms256m -Xmx512m -XX:NewSize=128m -XX:MaxNewSize=256m -XX:MaxMetaspaceSize=256m

-XX:+UseConcMarkSweepGC -XX:+UseCompressedOops -XX:MaxGCPauseMillis=50 -XX:+CMSParallelRemarkEnabled -XX:+CMSClassUnloadingEnabled-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/ubuntu/gc.log'

其中

-verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/ubuntu/gc.log

参数用于开发和测试调试,查看JVM的相关gc日志

java启动参数_Java启动参数的思考相关推荐

  1. java 什么是参数_java中参数是什么?

    java中参数是什么?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java中参数是什么? 参数分为实参和形参.方法名 ...

  2. java+list可变参数_Java 可变参数

    众所周知, Java可以通过... 来给一个方法定义一个可变长度的参数. 例如 // 返回可变参数的个数 public void method(int ... i){ System.out.print ...

  3. java变长参数_Java可变长度参数

    术语"varargs"是"variable-length arguments"(可变长度参数)的缩写. 可变长度参数声明一个接受可变数量的参数(或参数)的方法或 ...

  4. java backlog满_java socket参数详解:BackLog

    输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数.如果队列满时收到连接指示,则拒绝该连接. 注意: 1. backlog参数必须是大于 0 的正值.如果传递的值等于或小于 0, ...

  5. java方法的参数_Java方法参数

    Java方法参数 在程序设计语言中如何将参数传给方法(或函数): 按值调用:方法接受的是调用者提供的值 按引用调用:方法接受的是调用者提供的地址 Java程序设计语言总是采用按值调用(方法得到的是所有 ...

  6. java 不定参数_Java不定参数

    先看两个简单的例子,来感受一下Java的不定长度参数 第一个例子: Java代码   public class VariArgs { public static void main(String[]  ...

  7. java方法可选参数_Java可选参数

    java方法可选参数 在Java类中设计方法时,某些参数对于其执行而言可能是可选的. 无论是在DTO,胖模型域对象还是简单的无状态服务类中,可选方法参数都是常见的. 从本文中, 您将学习如何在Java ...

  8. java 接口校验接收参数_java接口参数校验

    (可扩充) 命令编号 命令名称 参数命令 提取现场机时间 上传现场机时间 设置现... 接口标准> (以下简称"接口标准" ) <数据对接接口校验规则> < ...

  9. java 不定参数_JAVA不定参数探秘

    JAVA中可以使用不定参数, 例如 public void test(String ...args){...} 这里test方法可以传入参数的情况是: 1.不使用参数,如test() 2.使用一个或多 ...

最新文章

  1. 一般将来时语法课教案_「英语语法」一般过去时用法技巧全解
  2. 在HTML中英文换行问题
  3. 财经法规税收征收管理法律制度练习题二
  4. Java 第四周总结
  5. es5直接引入html文件,ES6+转ES5(webpack+babel、指定多个js文件、自动注入)
  6. 29.C++- 异常处理
  7. 解读cartographer/common/port.h--Cartographer(一)
  8. 公司管理系列--最难挖的阿里,最好挖的百度;最难走的360,最易走的腾讯
  9. Apache Flink 的迁移之路,2 年处理效果提升 5 倍
  10. WPS 删除线快捷键
  11. 机器学习(非线性回归)
  12. 小白怎么入门网络安全?
  13. 安装 office2021
  14. 前端Bootstrap框架
  15. USB1.0到USB3.0传输速率、供电电压、电流、外形、颜色、认证图标对比
  16. 阿里云文件存储NAS和对象存储OSS区别对比如何选择?
  17. c语言编程彩虹桥,语言彩虹桥教案
  18. 休眠与待机等状态面面观(S0,S1,S2,S3,S4,S5)
  19. 油猴脚本推荐--定期更新包含(夸克网盘下载)
  20. 智能汽车雷达解析-立哥技术

热门文章

  1. 当TIME_WAIT状态的TCP正常挥手,收到SYN后…
  2. 教你如何将二进制文件导入到数据库
  3. LiteOS内核源码分析:任务LOS_Schedule
  4. 让你的产品更懂世界:如何提升场景文本识别中的语言模型
  5. 【华为云技术分享】竞享实例:让你尽享云服务的“鱼”和“熊掌”
  6. 高等组合学笔记(十三):组合反演,反演公式
  7. 如何清空一个数组内容
  8. poj 1751 Highways 最小生成树Kruskal(、Prim还没写
  9. 从零开始学Pytorch(四)之softmax与分类模型
  10. WORD填空题设置下划线?