Linux環境下,啟動tomcat報出如題的警告信息,雖然對系統正常使用沒有多大影響,但是會導致tomcat的日志垃圾信息很多,而且看起來很不爽。。。
具體的警告信息如下:
1 Jan 30, 2018 7:10:11 PM java.util.prefs.FileSystemPreferences checkLockFile0ErrorCode 2 WARNING: Could not lock System prefs. Unix error code 32672. 3 Jan 30, 2018 7:10:11 PM java.util.prefs.FileSystemPreferences checkLockFile0ErrorCode 4 WARNING: Could not lock System prefs. Unix error code 32672. 5 Jan 30, 2018 7:10:11 PM java.util.prefs.FileSystemPreferences syncWorld 6 WARNING: Couldn't flush system prefs: java.util.prefs.BackingStoreException: Couldn't get file lock. 7 Jan 30, 2018 7:10:11 PM java.util.prefs.FileSystemPreferences syncWorld 8 WARNING: Couldn't flush system prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.
具體針對這個問題,可以查看java的api文檔:http://www.docjar.com/html/api/java/util/prefs/FileSystemPreferences.java.html
我的環境是JDK7,tomcat7. 當前用戶是tomcat
這里記錄一下我的調查過程和方案。
《一》調查分析
從上述api的說明文檔,WARNING的信息默認是30秒一次輸出,默認是指沒有配置JVM的參數"java.util.prefs.syncInterval"。
/** * Sync interval in seconds. */ private static final int SYNC_INTERVAL = Math.max(1, Integer.parseInt(AccessController.doPrivileged(new sun.security.action.GetPropertyAction("java.util.prefs.syncInterval", "30"))));
另外結合輸出的warning信息,反查這個api的說明文檔,重點看java.util.prefs.userRoot和java.util.prefs.systemRoot參數的配置,其實這兩個參數指定的是一個路徑。另外還要配置一下權限。這里的權限主要有如下幾種:
/** * Unix user write/read permission */ private static final int USER_READ_WRITE = 0600; private static final int USER_RW_ALL_READ = 0644; private static final int USER_RWX_ALL_RX = 0755; private static final int USER_RWX = 0700;
針對上述兩步,配置上路徑以及權限后,就應該可以避免爆出WARNING提醒了。
《二》具體操作
處理的辦法,簡單直接的辦法,就是在當前用戶的home目錄下做如下操作,先檢查/home/tomcat目錄下是否存在.java目錄,若有,就看看是否存在.systemPrefs和.userPrefs目錄,缺什么就補充上什么,最簡單的做法是刪除.java目錄,然后按下面步驟創建:
mkdir -p ~/.java/.systemPrefs mkdir -p ~/.java/.userPrefs chmod -R 700 ~/.java
完成上述操作后,再去修改相應的tomcat的啟動文件:
[tomcat@t0-tkol-ims-app01 bin]$ pwd /u02/tomcat/8080/bin
修改catalina.sh,在JAVA_OPTS最后面添加上-Djava.util.prefs.systemRoot=/home/tomcat/.java -Djava.util.prefs.userRoot=/home/tomcat/.java/.userPrefs
[tomcat@t0-tkol-ims-app01 bin]$ vim catalina.sh JAVA_OPTS=" -server -Xms2048M -Xmx2048M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=300M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djava.util.prefs.systemRoot=/home/tomcat/.java -Djava.util.prefs.userRoot=/home/tomcat/.java/.userPrefs"
完成上述兩個步驟后,就是將tomcat進行重啟。查看tomcat的catalina.out的日志,的確不再出現上述開篇出現的WARNING信息了。
注意一點,就是關於systemRoot以及userRoot的參數配置信息,只要配置到jvm即可,至於在什么文件里面,是不是在catalina.sh,不是重點,重點是要告知jvm這些參數信息即可。
