protected String toJavaClassName(byte[] symbol, int start) {
        int end = symbol.length;
        if (start > 0) {
            switch (symbol[start]) {
                case 'B':
                    return "byte";
                case 'C':
                    return "char";
                case 'S':
                    return "short";
                case 'I':
                    return "int";
                case 'J':
                    return "long";
                case 'Z':
                    return "boolean";
                case 'F':
                    return "float";
                case 'D':
                    return "double";
                case 'L':
                    start++;
                    end--;
            }
        }

        // make signature normal
        for (int i = end - 2; i > start; i--) {
            if (symbol[i] == '/' || symbol[i] == '.') {
                if (symbol[i + 1] >= '0' && symbol[i + 1] <= '9') {
                    end = i;
                    if (i > start + 19 && symbol[i - 19] == '+' && symbol[i - 18] == '0') {
                        // Original JFR transforms lambda names to something like
                        // pkg.ClassName$$Lambda+0x00007f8177090218/543846639
                        end = i - 19;
                    }
                }
                break;
            }
        }

        String s = new String(symbol, start, end - start, StandardCharsets.UTF_8);
        return s.replace('/', '.');
    }
JFRConverter is copied from one.jfr.JfrConverter. Because need to
add collectMultiEvents and getEventAggregator methods, to parse 
and process multiple events at one time.
oap-server/server-library/library-async-profiler-jfr-parser/src/main/java/one/jfr/JFRConverter.java