帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:内存  acc  JVM  低级别  MEMO  NAT  Level  Native  
Low level access to native memory, JVM and OS.

  • 源代码名称:Chronicle-Core
  • 源代码网址:http://www.github.com/OpenHFT/Chronicle-Core
  • Chronicle-Core源代码文档
  • Chronicle-Core源代码下载
  • Git URL:
    git://www.github.com/OpenHFT/Chronicle-Core.git
  • Git Clone代码到本地:
    git clone http://www.github.com/OpenHFT/Chronicle-Core
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/OpenHFT/Chronicle-Core
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • 历史内核

    Maven Central

    这里库包装低级别访问

    关闭堆内存访问

    这允许你使用原语和一些线程安全操作来访问本机内存。

    
    
    
    
    Memory memory = OS.memory();
    
    
    long address = memory.allocate(1024);
    
    
    try {
    
    
     memory.writeInt(address, 1);
    
    
     assert memory.readInt(address) == 1;
    
    
     final boolean swapped = memory.compareAndSwapInt(address, 1, 2);
    
    
     assert swapped;
    
    
     assert memory.readInt(address) == 2;
    
    
    } finally {
    
    
     memory.freeMemory(address, 1024);
    
    
    }
    
    
    
    
    服务器端访问方法

    检查JVM是否在调试模式下运行

    
    
    
    
    if (Jvm.isDebug()) {
    
    
     // running in debug.
    
    
    
    

    将选中的异常重新引发为未选中的异常。

    
    
    
    
    try {
    
    
     // IO operation
    
    
    } catch (IOException ioe) {
    
    
     throw Jvm.rethrow(ioe);
    
    
    }
    
    
    
    

    按名称获取类的字段

    
    
    
    
    Field theUnsafe = Jvm.getField(Unsafe.class, "theUnsafe");
    
    
    Unsafe unsafe = (Unsafe) theUnsafe.get(null);
    
    
    
    
    命令行操作系统调用

    访问系统调用

    
    
    
    
    int processId = OS.getProcessId();
    
    
    int maxProcessId = OS.getMaxProcessId();
    
    
    int pageSize = OS.getPageSize();
    
    
    boolean isWindows = OS.isWindows();
    
    
    boolean is64bit = OS.is64Bit();
    
    
    String hostname = OS.getHostName();
    
    
    String username = OS.getUserName();
    
    
    String targetDir = OS.getTarget(); // where is the target directory during builds.
    
    
    
    

    内存映射文件

    
    
    
    
    FileChannel fc = new RandomAccessFile(fileName, "rw").getChannel();
    
    
    // map in 64 KiB
    
    
    long address = OS.map(fc, MapMode.READ_WRITE, 0, 64 << 10);
    
    
    // use address
    
    
    OS.memory().writeLong(1024L, 0x1234567890ABCDEFL);
    
    
    // unmap memory region
    
    
    OS.unmap(address, 64 << 10);
    
    
    
    
    资源引用计数

    使用引用计数确定释放资源。

    
    
    
    
    MappedFile mf = MappedFile.mappedFile(tmp, chunkSize, 0);
    
    
    MappedBytesStore bs = mf.acquireByteStore(chunkSize + (1 << 10));
    
    
    
    assertEquals(2, mf.refCount());
    
    
    assertEquals(3, bs.refCount());
    
    
    assertEquals("refCount: 2, 0, 3", mf.referenceCounts());
    
    
    
    mf.close();
    
    
    assertEquals(2, bs.refCount());
    
    
    assertEquals("refCount: 1, 0, 2", mf.referenceCounts());
    
    
    bs2.release();
    
    
    assertEquals(1, mf.refCount());
    
    
    assertEquals(1, bs.refCount());
    
    
    bs.release();
    
    
    assertEquals(0, bs.refCount());
    
    
    assertEquals(0, mf.refCount());
    
    
    assertEquals("refCount: 0, 0, 0", mf.referenceCounts());
    
    
    
    
    对象池

    要将CharSequence转换为字符串,可以使用字符串和 enum 对象池。

    
    
    
    
    Bytes b = Bytes.from("Hello World");
    
    
    b.readSkip(6);
    
    
    
    StringInterner si = new StringInterner(128);
    
    
    String s = si.intern(b);
    
    
    String s2 = si.intern(b);
    
    
    assertEquals("World", s);
    
    
    assertSame(s, s2);
    
    
    
    
    类本地缓存

    使用lambda为每个类添加数据结构缓存

    
    
    
    
    public static final ClassLocal<EnumInterner> ENUM_INTERNER = 
    
    
     ClassLocal.withInitial(c -> new EnumInterner<>(c));
    
    
    
    E enumValue = ENUM_INTERNER.get(enumClass).intern(stringBuilder);
    
    
    
    
    数学功能

    支持圆的数学函数

    
    
    
    
    double a = 0.1;
    
    
    double b = 0.3;
    
    
    double c= Maths.round2(b - a); // 0.2 rounded to 2 decimal places
    
    
    
    

    检查类型转换

    
    
    
    
    int i = Maths.toInt32(longValue);
    
    
    
    
    可以序列化的lambda

    有很多FunctionalInterfaces可以作为方法参数使用。 这允许隐式地使lambda可以序列化。

    
    
    
    
    // in KeyedVisitable
    
    
    default <R> R applyToKey(K key, @NotNull SerializableFunction<E, R> function) {
    
    
    
    // in code
    
    
    
    String fullename = map.applyToKey("u:123223", u -> u.getFullName());
    
    
    
    
    直方图

    一种高动态范围的高动态。

    
    
    
    
    Histogram h = new Histogram(32, 4);
    
    
    long start = instance.ticks(), prev = start;
    
    
    for (int i = 0; i <= 1000_000_000; i++) {
    
    
     long now = instance.ticks();
    
    
     long time = now - prev;
    
    
     h.sample(time);
    
    
     prev = now;
    
    
    }
    
    
    System.out.println(h.toLongMicrosFormat(instance::toMicros));
    
    
    
    
    JLBH

    Java延迟基准线束是一种工具,允许你对运行在上下文中的代码进行基准测试,而不是。 在系列文章中可以找到很好的介绍。

    由于这些文章是写的主要更改是允许JLBH安装到事件循环,而不是在它自己的线程中运行。 为此,请使用 JLBH.eventLoopHandler 方法而不是 JLBH.start.



    文章标签:acc  NAT  Native  Level  MEMO  内存  JVM  低级别  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语