package com.alibaba.json.test; import java.lang.management.ManagementFactory; import javax.management.MBeanServer; import javax.management.ObjectName; import com.alibaba.fastjson.util.IOUtils; public class TestUtils { // **************************************************************************************** // * char[] version // **************************************************************************************** /** * Encodes a raw byte array into a BASE64 <code>char[]</code> representation i accordance with RFC 2045. * * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned. * @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br> * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a little faster. * @return A BASE64 encoded array. Never <code>null</code>. */ private final static char[] encodeToChar(byte[] sArr, boolean lineSep) { char[] CA = IOUtils.CA; // Check special case int sLen = sArr != null ? sArr.length : 0; if (sLen == 0) return new char[0]; int eLen = (sLen / 3) * 3; // Length of even 24-bits. int cCnt = ((sLen - 1) / 3 + 1) << 2; // Returned character count int dLen = cCnt + (lineSep ? (cCnt - 1) / 76 << 1 : 0); // Length of returned array char[] dArr = new char[dLen]; // Encode even 24-bits for (int s = 0, d = 0, cc = 0; s < eLen;) { // Copy next three bytes into lower 24 bits of int, paying attension to sign. int i = (sArr[s++] & 0xff) << 16 | (sArr[s++] & 0xff) << 8 | (sArr[s++] & 0xff); // Encode the int into four chars dArr[d++] = CA[(i >>> 18) & 0x3f]; dArr[d++] = CA[(i >>> 12) & 0x3f]; dArr[d++] = CA[(i >>> 6) & 0x3f]; dArr[d++] = CA[i & 0x3f]; // Add optional line separator if (lineSep && ++cc == 19 && d < dLen - 2) { dArr[d++] = '\r'; dArr[d++] = '\n'; cc = 0; } } // Pad and encode last bits if source isn't even 24 bits. int left = sLen - eLen; // 0 - 2. if (left > 0) { // Prepare the int int i = ((sArr[eLen] & 0xff) << 10) | (left == 2 ? ((sArr[sLen - 1] & 0xff) << 2) : 0); // Set last four chars dArr[dLen - 4] = CA[i >> 12]; dArr[dLen - 3] = CA[(i >>> 6) & 0x3f]; dArr[dLen - 2] = left == 2 ? CA[i & 0x3f] : '='; dArr[dLen - 1] = '='; } return dArr; } // **************************************************************************************** // * String version // **************************************************************************************** /** * Encodes a raw byte array into a BASE64 <code>String</code> representation i accordance with RFC 2045. * * @param sArr The bytes to convert. If <code>null</code> or length 0 an empty array will be returned. * @param lineSep Optional "\r\n" after 76 characters, unless end of file.<br> * No line separator will be in breach of RFC 2045 which specifies max 76 per line but will be a little faster. * @return A BASE64 encoded array. Never <code>null</code>. */ public final static String encodeToBase64String(byte[] sArr, boolean lineSep) { // Reuse char[] since we can't create a String incrementally anyway and StringBuffer/Builder would be slower. return new String(encodeToChar(sArr, lineSep)); } public static long getYoungGC() { try { // java.lang:type=GarbageCollector,name=G1 Young Generation // java.lang:type=GarbageCollector,name=G1 Old Generation MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionCount"); } catch (Exception e) { throw new RuntimeException("error"); } } public static long getYoungGCTime() { try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ParNew"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ParNew"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=Copy"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=Copy"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Young Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS Scavenge"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionTime"); } catch (Exception e) { throw new RuntimeException("error", e); } } public static long getFullGC() { try { MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer(); ObjectName objectName; if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=ConcurrentMarkSweep"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=MarkSweepCompact"); } else if (mbeanServer.isRegistered(new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation"))) { objectName = new ObjectName("java.lang:type=GarbageCollector,name=G1 Old Generation"); } else { objectName = new ObjectName("java.lang:type=GarbageCollector,name=PS MarkSweep"); } return (Long) mbeanServer.getAttribute(objectName, "CollectionCount"); } catch (Exception e) { throw new RuntimeException("error"); } } }