import java.util.ArrayList; import java.util.List; public class TestStatic { static byte[] bytes = new byte[1024 * 1024 * 80]; /** * -Xms150m -Xmx150m -XX:+PrintGCDetails * -Xms150m -Xmx1500m -XX:+PrintGCDetails * * 由此验证:静态的对象所占用的内存不会被回收.即使该对象从未被别处使用(引用). * 另外验证:当一个线程因为OOM挂掉以后,该线程所占的内存都会被回收. * */ public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { while (true) { Runtime runtime = Runtime.getRuntime(); long maxMemory = runtime.maxMemory(); long totalMemory = runtime.totalMemory(); long freeMemory = runtime.freeMemory(); System.out.println("maxMemory:"+maxMemory+"-----totalMemory:"+totalMemory+"-----freeMemory:"+freeMemory); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } },"获取内存状态线程").start(); Thread worker = new Thread(new Runnable() { @Override public void run() { while (true) { List<byte[]> list = new ArrayList<>(); for (int i = 1; i <= 6; i++) { System.out.println("工作线程循环次数:" + i); list.add(new byte[1024 * 1024 * 10]); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } }, "循环工作线程"); worker.start(); new Thread(new Runnable() { @Override public void run() { while (true) { if (!worker.isAlive()) { List<byte[]> list2 = new ArrayList<>(); for (int i = 1; i <= 30; i++) { System.out.println("监控线程循环次数:" + i); list2.add(new byte[1024 * 1024 * 1]); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }).start(); } }
静态对象不会被回收
最新推荐文章于 2023-08-07 09:46:44 发布