FileUtil.java 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package com.yihu.jw.utils;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.lang.reflect.Method;
  5. import java.nio.MappedByteBuffer;
  6. import java.security.AccessController;
  7. import java.security.PrivilegedAction;
  8. public class FileUtil {
  9. private static final Logger logger = LoggerFactory.getLogger(FileUtil.class);
  10. /**
  11. * 在MappedByteBuffer释放后再对它进行读操作的话就会引发jvm crash,在并发情况下很容易发生
  12. * 正在释放时另一个线程正开始读取,于是crash就发生了。所以为了系统稳定性释放前一般需要检 查是否还有线程在读或写
  13. * @param mappedByteBuffer
  14. */
  15. public static void freedMappedByteBuffer(final MappedByteBuffer mappedByteBuffer) {
  16. try {
  17. if (mappedByteBuffer == null) {
  18. return;
  19. }
  20. mappedByteBuffer.force();
  21. AccessController.doPrivileged(new PrivilegedAction<Object>() {
  22. @Override
  23. public Object run() {
  24. try {
  25. Method getCleanerMethod = mappedByteBuffer.getClass().getMethod("cleaner", new Class[0]);
  26. //可以访问private的权限
  27. getCleanerMethod.setAccessible(true);
  28. //在具有指定参数的 方法对象上调用此 方法对象表示的底层方法
  29. sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod.invoke(mappedByteBuffer,
  30. new Object[0]);
  31. cleaner.clean();
  32. } catch (Exception e) {
  33. logger.error("clean MappedByteBuffer error!!!", e);
  34. }
  35. logger.info("clean MappedByteBuffer completed!!!");
  36. return null;
  37. }
  38. });
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }