采用类加载器加载多次类,perm区满了,发生FGC
来源:互联网 发布:凤城一路淘宝店 编辑:程序博客网 时间:2024/05/16 07:40
1. 编写的自定义类加载器import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;public class MyClassloader extends ClassLoader { public Class<?> findClass(String name) { byte[] data = loadClassData(name); return defineClass(name, data, 0, data.length); } private byte[] loadClassData(String name) { FileInputStream fis = null; byte[] data = null; try { fis = new FileInputStream(new File(getFinalPath(name))); ByteArrayOutputStream baos = new ByteArrayOutputStream(); int ch = 0; while ((ch = fis.read()) != -1) { baos.write(ch); } data = baos.toByteArray(); } catch (Exception e) { e.printStackTrace(); } return data; } private String getFinalPath(String name) { String finalPath = ""; String path = System.getProperty("user.dir"); String[] nameStrings = name.split("\\."); String tempStr = ""; for (String str : nameStrings) { tempStr = tempStr + str + File.separatorChar; } tempStr = tempStr.substring(0, tempStr.lastIndexOf(File.separatorChar)); finalPath = path + File.separator + tempStr + ".class"; return finalPath; }}
2. 编写的发生GC的程序
public class GcDemo { private final static String str = "sdfskfjskfjskfjskfjskdjf"; static{ str.intern(); // 会进入Perm区 } public static void main(String[] args) throws Exception { MemoryObject object = new MemoryObject(1024 * 1024); for (int i = 0; i < 2; i++) { happenMinorGC(11); Thread.sleep(10000); } } private static void happenMinorGC(int happenMinorGCIndex) throws Exception { for (int i = 0; i < happenMinorGCIndex; i++) { if (i == happenMinorGCIndex - 1) { Thread.sleep(10000); System.out.println("minor gc should happen"); } new MemoryObject(1024 * 1024); } }}class MemoryObject { private byte[] bytes; public MemoryObject(int objectSize) { this.bytes = new byte[objectSize]; }}
3. 测试Perm区满的时候,是否发生FGC?
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyApp { public static void main(String[] args) throws InterruptedException,InstantiationException, IllegalAccessException { // local int size = 100; ExecutorService es = Executors.newFixedThreadPool(size); for(int i=0 ;i< size;i++){ es.execute(new Runnable(){ @Override public void run() { for(int i=0;i<20000;i++) { MyClassloader loader = new MyClassloader(); Class<?> objClass = loader.findClass("GcDemo"); Object service; try { service = objClass.newInstance(); System.out.println(service.getClass()); System.out.println(objClass.getName()); System.out.println(objClass.getClassLoader()); System.out.println(service); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(GcDemo.class.getClassLoader()); Thread.yield(); } } }); } es.shutdown(); }}
结论: 当perm区满的时候是会发生FGC的。
参考: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html
- 采用类加载器加载多次类,perm区满了,发生FGC
- 加载、类加载、类加载器
- 2 :为什么要类加载器,类加载器做了什么,加载类的过程
- 类加载器入了个门
- dex2oat 加载多次
- 新版Spring4.0中加载配置文件的类发生改变
- 证明加载类的动作仅发生一次
- 从输入URL到页面加载发生了什么
- 从输入URL到页面加载发生了什么
- 从输入url到加载界面完成,发生了什么?
- 从输入URL到页面加载,发生了什么
- 从地址栏输入URL到页面加载发生了什么
- 从输入URL到页面加载发生了什么
- 从输入URL到页面加载发生了什么
- 采用类加载器解决jar hell(jar冲突)有关问题
- 类加载过程---加载
- framework bundle多次加载注意
- 类加载机制及类加载器加载Class流程
- Jni中C++和Java的数据类型的对应关系
- openMP 并行编程基础
- Activity启动Activity之后,接收其返回的信息
- 百度文库下载方法
- 获取AndroidManifest里的信息
- 采用类加载器加载多次类,perm区满了,发生FGC
- 总结: 笔试中常见virtual函数问题
- c代码调用c++类的方法
- EL表达式 (详解) .
- 2012开篇
- LINQ学习之旅
- mantis配置文件设置 (mantis_v1.2.0)
- DataSet,DataTable,DateView的关系和用法
- Latent dirichlet allocation note -- Prepare