我有一个Solr实例,由Tomcat托管,最近开始创建minidump文件.任何日志中没有任何错误,Solr继续使用.
这些文件大约是14GB,正在填满硬盘.在我们调查这个问题的时候有没有办法解决这个问题?
解决方法
一般来说,当JVM崩溃时,hs_err错误日志文件(由-XX:ErrorFile控制)的内容通常足以指出可能出现的问题.
为了防止Oracle JVM Hotspot生成Windows minidump(mdmp文件),在命令行中使用的JVM选项是:-XX:-CreateMinidumpOnCrash
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hotspot JVM提供以下三大类选项:
1. 标准选项:这类选项的功能是很稳定的,在后续版本中也不太会发生变化。运行java或者java -help可以看到所有的标准选项。所有的标准选项都是以-开头,比如-version, -server等。
2. X选项:比如-Xms。这类选项都是以-X开头,可能由于这个原因它们被称为X选项。运行java -X命令可以看到所有的X选项。这类选项的功能还是很稳定,但官方的说法是它们的行为可能会在后续版本中改变,也有可能不在后续版本中提供了。
3. XX选项:这类选项是属于实验性,主要是给JVM开发者用于开发和调试JVM的,在后续的版本中行为有可能会变化。
XX选项的语法
如果是布尔类型的选项,它的格式为-XX:+flag或者-XX:-flag,分别表示开启和关闭该选项。
针对非布尔类型的选项,它的格式为-XX:flag=value
————————————————
内存大小相关的选项
-Xms 设置初始堆的大小,也是最小堆的大小,它等价于:-XX:InitialHeapSize
-Xmx 设置最大堆的大小,它等价于-XX:MaxHeapSize。
比如,下面这条命令就是设置堆的初始值为128m,最大值为2g。
java -Xms128m -Xmx2g MyApp
————————————————
在Hotspot JVM中,侧重于吞吐量的垃圾回收器是Parallel Scavenge,它的相关选项如下:
-XX:+UseParallelOldGC 表示新生代和老生代都使用并行回收器,其中的Old表示老生代的意思,而不是旧的意思。
-XX:ParallelGCThreads=n 表示配置多少个线程来回收垃圾。默认的配置是如果处理器的个数小于8,那么就是处理器的个数;如果处理器大于8,它的值就是3+5N/8。也可以根据程序的需要去设置这个值,比如你的机器有16核,上面有4个Java程序,那么设置将这个值设置为4比较合理,因为JVM不会去探测同一机器上有多少个Java程序。
-XX:UseAdaptiveSizePolicy 表示是否开启自适应策略,打开这个开关后,JVM自动调节JVM的新生代大小,Eden和Survivor的比例等参数。用户只需要设置期望的吞吐量(-XX:GCTimeRatio)和期望的停顿时间(-XX:MaxGCPauseMillis)。然后,JVM会尽量去向用户期望的方向去优化。
————————————————
- -Xloggc:<file> 表示把GC日志写入到一个文件中去,而不是打印到标准输出中。
需要注意的是:这些和GC日志相关的选项可以在JVM已经启动后再开启,可以通过jinfo这个工具去设置。具体可以参见jinfo的帮助文件。这样就可以在需要诊断问题的时候再开启GC日志。