JVM Memory 代码-Java语言-立哥开发

//Copy right 2020 Jacky Zong.All rights reserved.
package encyrption;

import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import sun.misc.Unsafe;

import java.lang.reflect.Field;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;


public class MemoryAccessMain {
    public static final int ARRAY_BYTE_BASE_OFFSET;
    public static final int ARRAY_INT_BASE_OFFSET;
    static final String text = "0123456789" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
            "abcdefghijklmnopqrstuvwxyz-_" +
            "0123456789" +
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
            "abcdefghijklmnopqrstuvwxyz-_";
    static final Unsafe UNSAFE;
    static final int ARRAY_LONG_BASE_OFFSET;
    private static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1");
    static byte[] byteArray = text.getBytes(ISO_8859_1);
    static int[] intArray = new int[byteArray.length / 4];
    static int[] longArray = new int[byteArray.length / 8];
    static ByteBuffer bb = ByteBuffer.allocateDirect(text.length());

    static {
        try {
            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            UNSAFE = (Unsafe) theUnsafe.get(null);
            ARRAY_BYTE_BASE_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);
            ARRAY_INT_BASE_OFFSET = UNSAFE.arrayBaseOffset(int[].class);
            ARRAY_LONG_BASE_OFFSET = UNSAFE.arrayBaseOffset(long[].class);

            UNSAFE.copyMemory(byteArray, ARRAY_BYTE_BASE_OFFSET, intArray, ARRAY_INT_BASE_OFFSET, byteArray.length);
            ;
            UNSAFE.copyMemory(byteArray, ARRAY_BYTE_BASE_OFFSET, longArray, ARRAY_LONG_BASE_OFFSET, byteArray.length);
            for (int i = 0; i < text.length(); i++)
                bb.put((byte) text.charAt(i));
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }

    static long address(ByteBuffer bb) {
        return ((sun.nio.ch.DirectBuffer) bb).address();
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(MemoryAccessMain.class.getSimpleName())
                .forks(9)
                .build();

        new Runner(opt).run();
    }

    @Benchmark
    public long checkSumWithCopyByByte() {
        UNSAFE.copyMemory(null, address(bb), byteArray, ARRAY_BYTE_BASE_OFFSET, byteArray.length);
        long sum = 0;
        for (byte b : byteArray)
            sum += b;
        return sum;
    }

    @Benchmark
    public long checkSumWithCopyByInt() {
        UNSAFE.copyMemory(null, address(bb), intArray, ARRAY_INT_BASE_OFFSET, intArray.length * 4);
        long sum = 0;
        for (int b : intArray)
            sum += b;
        return sum;
    }

    @Benchmark
    public long checkSumWithCopyByLong() {
        UNSAFE.copyMemory(null, address(bb), longArray, ARRAY_LONG_BASE_OFFSET, longArray.length * 8);
        long sum = 0;
        for (long l : longArray)
            sum += l;
        return sum;
    }

    @Benchmark
    public long checkSumByteBufferByByte() {
        long sum = 0;
        int len = bb.capacity();
        for (int i = 0; i < len; i++)
            sum += bb.get(i);
        return sum;
    }

    @Benchmark
    public long checkSumByteBufferByInt() {
        long sum = 0;
        int len = bb.capacity();
        for (int i = 0; i < len; i += 4)
            sum += bb.getInt(i);
        return sum;
    }

    @Benchmark
    public long checkSumByteBufferByLong() {
        long sum = 0;
        int len = bb.capacity();
        for (int i = 0; i < len; i += 8)
            sum += bb.getLong(i);
        return sum;
    }

    @Benchmark
    public long checkSumNativeMemoryByByte() {
        long sum = 0;
        long address = address(bb);
        int len = bb.capacity();
        for (int i = 0; i < len; i++)
            sum += UNSAFE.getByte(address + i);
        return sum;
    }

    @Benchmark
    public long checkSumNativeMemoryByInt() {
        long sum = 0;
        long address = address(bb);
        int len = bb.capacity();
        for (int i = 0; i < len; i += 4)
            sum += UNSAFE.getInt(address + i);
        return sum;
    }

    @Benchmark
    public long checkSumNativeMemoryByLong() {
        long sum = 0;
        long address = address(bb);
        int len = bb.capacity();
        for (int i = 0; i < len; i += 8)
            sum += UNSAFE.getLong(address + i);
        return sum;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式系统通常对于资源和执行效率有严格的约束,导致了应用于嵌入式系统中的操作系统通常都提供非常有限的编程接口和系统支持。因此对于传统的嵌入式系统开发人员来说,开发难度相对较大,开发效率也相对较低。Java的出现缓解了这一情况。由于Java的跨平台特性,大批应用程序开发人员可以脱离硬件平台,在桌面的虚拟环境中开发嵌入式应用程序。 与传统的Java虚拟机不同,YJVM(Yet another JVM)是运行在嵌入式Linux内核中的Java虚拟机。实现了解释执行Java字节码、线程管理、执行环境管理、集成Classpath核心类库等基本功能。它可以使Linux在内核层次上支持Java的字节码,从而减少了软件层次、为提高效率留下空间。另外,YJVM中还构造了Java的进程管理,为在嵌入式环境中运行Java程序提供了更安全的环境。不同于纯粹用Java来实现的操作系统的尝试,这个方案更充分利用了现有的操作系统的实践成果,在不牺牲Java跨平台特性的前提下,更有实用价值。 本文从对嵌入式操作系统的讨论入手,结合Java虚拟机的原理和研究状况阐述了YJVM的设计和实现要点,体现了YJVM相比现有的嵌入式Java解决方案和Java操作系统的优势。本文的主要研究内容及成果包括: 1、作为一种嵌入式操作系统,嵌入式Linux的基本结构和与传统嵌入式操作系统相比的特点和优势。 2、嵌入式Java的传统解决方案和Java操作系统的基本结构。以及他们对于YJVM设计的影响和异同。 3、Java虚拟机的工作原理和结构。在YJVMJava虚拟机的结构和实现方案之间的具体映射。 4、YJVM中程序装载、解释器、进程管理、垃圾收集和对Classpath核心类库集成的具体实现要点. 5、测试方案的制定的依据和结果;测试例程的构造和选择;测试结果的分析和在此基础上提出的改进和发展方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值