反射到底做了什么?向classloader请求加载class吗?

chape 发布于 2013/12/19 16:47
阅读 493
收藏 1
 持久代装载的是class信息,做大量反射操作会引起Perm溢出,那新增加的数据是什么?
不是虚拟机启动时就加载了class信息了么? 
加载中
0
淘淘我的小宝宝
淘淘我的小宝宝
Class对象本身是加载了,但是反射操作做对象实例化那是需要资源的
CoserSeu
CoserSeu
楼主说的是Perm溢出,实例化对象操作在一般情况下是不会影响perm空间的的。​
0
CoserSeu
CoserSeu

JVM启动的时候并没把所有的类加载进来(确切的说是“未被直接引用的类”并没有被加载进来)。

比如JDBC的driver,Web应用中的servlet(它是靠应用服务器load入内存的),等等。

在程序运行的时候,需要动态的加载一些临时的、外部的或者可替换的类,这些类在JVM启动的时候是未被加载进来的。所以引起了Perm溢出。

CoserSeu
CoserSeu
回复 @chape : 这个我不是特别清楚,我认为只要是import了,classloader便会载入这个类。这方面你可以去看一下JVM的类加载机制,多个classloader负责加载不同层面上的类,网上很多资料,我这一时半会说不太清楚。
chape
chape
也就是说classloader只会加载直接调用,或import的class,那反射已经在程序中明确import的class会加重Perm吗?
0
DreamRoute
DreamRoute
反射解决的主要问题就是动态的东西,也就是在编译的时候不能确定的东西,或者说编译的时候未知的东西,在运行的时候动态的创建对象,调用方法等动作。
返回顶部
顶部