package AAAcollect;
import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import java.util.HashMap;
import java.util.Map;
// -verbose:class -verbose:gc
// Aviator是一个轻量级、高性能的Java表达式执行引擎,它动静地将表达式编译成字节码并运行。
// <!-- https://mvnrepository.com/art... -->
// <dependency>
// <groupId>com.googlecode.aviator</groupId>
// <artifactId>aviator</artifactId>
// <version>5.2.1</version>
// <version>5.2.7</version>
// </dependency>
public class YxhTest {
private static final AviatorEvaluatorInstance instance = AviatorEvaluator.newInstance();public static void main(String[] args) throws Exception { Thread.sleep(5000); instance.importFunctions(YxhService.class); YxhService yxhService = new YxhService(); for (int i = 0; i < 1900; i++) { Map<String, Object> env = new HashMap<>(); YxhDemo demo = new YxhDemo(); demo.setUid("123"); env.put("demo", demo); env.put("YxhService", yxhService); for (int j = 0; j < 128; j++) { instance.execute("a = YxhService.print(YxhService,demo.uid)", env, true); } SoftRefTest.doyang(); } Thread.sleep(10000000);}
}
package AAAcollect;
public class YxhService {
public String print(String str){ return str;}
}
package AAAcollect;
public class YxhDemo {
public String getUid() { return uid;}public void setUid(String uid) { this.uid = uid;}public String uid;public String print(String str){ return str;}
}
package AAAcollect;
import java.lang.reflect.Method;
// -XX:+UseG1GC
// -XX:+UseConcMarkSweepGC
// -Xloggc:gc.log
// -verbose:class
// -Xms50m -Xmx50m -XX:+UseConcMarkSweepGC -verbose:gc -verbose:class -XX:+PrintGC -XX:SoftRefLRUPolicyMSPerMB=0 -XX:MaxMetaspaceSize=32m
// -Xms50m -Xmx50m -XX:+UseG1GC -verbose:gc -verbose:class -XX:+PrintGC -XX:SoftRefLRUPolicyMSPerMB=0
public class SoftRefTest {
public static void main(String[] args) throws Exception { Thread.sleep(5000); for (int t = 0; t < 35000; t++) { // 触发yanggc
// doyang();
// doyang();
new SoftRefTest().doso(); // 触发yanggc // doyang(); // 触发yanggc doyang(); // doyang(); }}public static void doyang() { for (int ct = 0; ct < 6000; ct++) { byte[] bytes = new byte[1024 * 10]; for (int i = 0; i < bytes.length; i++) { bytes[i] = '1'; } }}public static void doso() throws Exception { Class<?> clz = Class.forName("MethodAccessor.A"); Object o = clz.newInstance(); Method m = clz.getMethod("foo", String.class); for (int i = 0; i < 20; i++) { m.invoke(o, ""); }}
}
package AAAcollect;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializeConfig;
// 元空间有余,间接扩容,如果扩容到MetaspaceSize引发old gc(依据垃圾回收器决定),卸载类并扩容
// 扩容到MaxMetaspaceSize,引发full gc 卸载类。
public class SerializeConfigTest {
public static String buildData(Object bean) { try { // 每次new 一个Config 会导致每次生成一个序列化类, // 而后用不同的类加载器加载进来,导致暂用元空间的内存 SerializeConfig CONFIG = new SerializeConfig(); JSON.toJSONString(bean, CONFIG); return ""; } catch (Exception e) { return null; }}// -XX:MaxMetaspaceSize=40m -Xms50m -Xmx50m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseConcMarkSweepGCpublic static void main(String[] args) throws Exception { System.out.println("======================================"); Thread.sleep(3000); int i = 0; while (i < 900000) { buildData(new SerializeConfigTest()); i++; } System.out.println("==============================================="); Thread.sleep(1000000000);}
}
package AAAcollect;
import MethodAccessor.WeakRefTest;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodType;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import static java.lang.invoke.MethodHandles.lookup;
// -XX:+UnlockDiagnosticVMOptions -Xms50m -Xmx50m -verbose:class -verbose:gc
// -XX:+ShowHiddenFrames -Djava.lang.invoke.MethodHandle.DUMP_CLASS_FILES=true
// 同一个methodHandle对象调用127次后都会加载一个新的类,同一个办法的不同methodHandler对象不共用次数
public class MHTest {
class GrandFather { void thinking() { System.out.println("i am grandfather"); } String talk(String s) { // System.out.println("i am grandfather talk"); return s; }}class Father extends GrandFather { void thinking() {
// new Exception().printStackTrace();
} String talk(String s) { if (s.equals("1") || s.equals("127")) { new Exception().printStackTrace(); } return s; }}class Son extends Father { void thinking() { System.out.println("i am son"); }}public void showMt(MethodHandle mh) throws Throwable { Field field = MethodHandle.class.getDeclaredField("asTypeCache"); Field field2 = MethodHandle.class.getDeclaredField("customizationCount"); field.setAccessible(true); field2.setAccessible(true); MethodHandle mhCache = (MethodHandle) field.get(mh); System.out.println(field2.get(mhCache));}public void dododo() throws Throwable { for (int i = 0; i < 128; i++) { MethodType mt = MethodType.methodType(String.class, String.class); MethodHandle mh = lookup().findVirtual(GrandFather.class, "talk", mt) .bindTo(new MHTest().new Father()); mh.invoke("" + i); showMt(mh); }}public static void main(String[] args) { try { Thread.sleep(3000); for (int i = 0; i < 10000; i++) { Thread.sleep(5000); new MHTest().dododo(); System.out.println("================"); } } catch (Throwable e) { e.printStackTrace(); }}
}
package AAAcollect;
import sun.nio.ch.Util;
import java.io.File;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
public class MapFileOperateTest {
public static void main(String[] args) throws Exception { File file = new File("D:\\Users\\YEZHENGWU839\\Desktop\\test.txt"); ByteBuffer buffer = ByteBuffer.allocateDirect(1024); FileChannel fileChannel = new RandomAccessFile(file, "rw") .getChannel(); MappedByteBuffer mappedByteBuffer = fileChannel.map( FileChannel.MapMode.READ_WRITE, 0, file.length()); mappedByteBuffer.put((byte) 54); mappedByteBuffer.put((byte) 59); mappedByteBuffer.put((byte) 60); // 强制刷盘 mappedByteBuffer.force(); System.out.println(mappedByteBuffer.get(0)); System.out.println(mappedByteBuffer.get(1)); System.out.println(mappedByteBuffer.get(2)); // 用threadLocal做了缓存 ByteBuffer byteBuffer = Util.getTemporaryDirectBuffer(20); for (int i = 0; i < 10; i++) { byteBuffer.put((byte) 53); } byteBuffer.flip(); // 从那个地位开始写 fileChannel.write(byteBuffer,3); System.out.println(); System.out.println(mappedByteBuffer.get(0)); System.out.println(mappedByteBuffer.get(1)); System.out.println(mappedByteBuffer.get(2)); fileChannel.force(true); fileChannel.read(buffer,3); buffer = null; System.gc(); Util.releaseTemporaryDirectBuffer(byteBuffer); Thread.sleep(300000);}
}
package AAAcollect;
import javax.management.MBeanAttributeInfo;
import javax.management.MBeanInfo;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
import java.util.List;
// -XX:MaxMetaspaceSize=200M -XX:MetaspaceSize=50M -XX:+UseG1GC
public class JvmMeans {
public static void main(String[] args) throws Exception { show();}public static void show() throws Exception { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); List<MemoryPoolMXBean> memoryPoolMXBeanList = ManagementFactory.getMemoryPoolMXBeans(); // 该信息提供了大量的信息。在 JVM 中,可能有几个内存池,因而有对应的内存池信息,因而,在工厂类中 //,getMemoryPoolMXBean() 失去是一个 MemoryPoolMXBean 的 list。每一个 MemoryPoolMXBean 都蕴含 long s = memoryPoolMXBeanList.get(1).getUsage().getMax(); System.out.println(s); //了该内存池的详细信息,如是否可用、以后已应用内存 / 最大应用内存值、以及设置最大内存值等等。 for (MemoryPoolMXBean memoryPoolMXBean : memoryPoolMXBeanList) { //内存池的名称 String poolName = memoryPoolMXBean.getName(); //内存管理器的名称 long committed = memoryPoolMXBean.getUsage().getCommitted(); long max = memoryPoolMXBean.getUsage().getMax(); long used = memoryPoolMXBean.getUsage().getUsed(); long init = memoryPoolMXBean.getUsage().getInit(); System.out.println("name " + poolName + "\r\nmax " + max + " committed " + committed + " used " + used + " init " + init); } ObjectName directName = new ObjectName("java.nio:type=BufferPool,name=direct"); ObjectName mappedName = new ObjectName("java.nio:type=BufferPool,name=mapped"); MBeanInfo directInfo = mbs.getMBeanInfo(directName); for (MBeanAttributeInfo i : directInfo.getAttributes()) { System.out.println(i.getName() + ":" + mbs.getAttribute(directName, i.getName())); } MBeanInfo mappedInfo = mbs.getMBeanInfo(mappedName); for (MBeanAttributeInfo i : mappedInfo.getAttributes()) { System.out.println(i.getName() + ":" + mbs.getAttribute(mappedName, i.getName())); }}
}
package AAAcollect;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class ConcurrentWeakInternSet<T> {
private final ConcurrentMap<WeakEntry<T>, WeakEntry<T>> map;private final ReferenceQueue<T> stale;public ConcurrentWeakInternSet() { this.map = new ConcurrentHashMap<>(); this.stale = new ReferenceQueue<>();}public T get(T elem) { if (elem == null) throw new NullPointerException(); expungeStaleElements(); WeakEntry<T> value = map.get(new WeakEntry<>(elem)); if (value != null) { T res = value.get(); if (res != null) { return res; } } return null;}public T add(T elem) { if (elem == null) throw new NullPointerException(); // Playing double race here, and so spinloop is required. // First race is with two concurrent updaters. // Second race is with GC purging weak ref under our feet. // Hopefully, we almost always end up with a single pass. T interned; WeakEntry<T> e = new WeakEntry<>(elem, stale); do { expungeStaleElements(); WeakEntry<T> exist = map.putIfAbsent(e, e); interned = (exist == null) ? elem : exist.get(); } while (interned == null); return interned;}private void expungeStaleElements() { Reference<? extends T> reference; while ((reference = stale.poll()) != null) { map.remove(reference); }}public ConcurrentMap<WeakEntry<T>, WeakEntry<T>> getMap() { return map;}private static class WeakEntry<T> extends WeakReference<T> { public final int hashcode; public WeakEntry(T key, ReferenceQueue<T> queue) { super(key, queue); hashcode = key.hashCode(); } public WeakEntry(T key) { super(key); hashcode = key.hashCode(); } @Override public boolean equals(Object obj) { if (obj instanceof WeakEntry) { Object that = ((WeakEntry) obj).get(); Object mine = get(); return (that == null || mine == null) ? (this == obj) : mine.equals(that); } return false; } @Override public int hashCode() { return hashcode; }}
}
package AAAcollect;
import MethodAccessor.A;
import sun.misc.Unsafe;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
/**
- defineAnonymousClass jvm定义匿名类
*/
// -XX:MaxMetaspaceSize=40M -XX:MetaspaceSize=32M -verbose:class -XX:MaxMetaspaceSize=40M -XX:MetaspaceSize=32M -verbose:class -XX:MaxMetaspaceSize=40M -XX:MetaspaceSize=32M -verbose:class -XX:+UseG1GC -verbose:gc -XX:+PrintGC
// -XX:+UnlockCommercialFeatures
// -XX:+FlightRecorder
// -XX:StartFlightRecording=delay=20s,duration=60s,filename=D:\myRecording.jfr,settings=default
// https://blog.csdn.net/dnc8371...
// https://blog.csdn.net/maosiju...
public class AnonymousClassTest {
public static void main(String args[]) throws Throwable { Thread.sleep(4000); Field f = Unsafe.class.getDeclaredField("theUnsafe"); f.setAccessible(true); Unsafe unsafe = (Unsafe) f.get(null); String filePath = "D:\\soft\\untitled\\target\\classes\\MethodAccessor\\Aa.class"; byte[] buffer = getBytesFromFile(filePath); Class<?> c1 = unsafe.defineAnonymousClass(A.class, buffer, null); System.out.println(c1.getName() + " " + c1.getClassLoader()); for (int i = 0; i < 40000; i++) { c1 = unsafe.defineAnonymousClass(A.class, buffer, null); Thread.sleep(1); } // Thread.sleep(1000000);}public static byte[] getBytesFromFile(String fileName) { try { // precondition File file = new File(fileName); InputStream is = new FileInputStream(file); long length = file.length(); byte[] bytes = new byte[(int) length]; // Read in the bytes int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file " + file.getName()); } is.close(); return bytes; } catch (Exception e) { System.out.println("error occurs in _ClassTransformer!" + e.getClass().getName()); return null; }}
}