Linux系統下啟動tomcat報錯【java.util.prefs.BackingStoreException: Couldn't get file lock】的解決方法


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.userRootjava.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這些參數信息即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM