hotpot的永久代一点想法

我终于明白了为什么有的FULL GC是针对永久代,有的full gc是带有方法区全部的gc了。因为我们现在用的虚拟机普遍是sun hotpot,它就是使用永久代来实现方法区的,这样jvm就能像管理java堆一样去管理这部分内存,而不需要再重新写管理内存的代码了。而其他的jvm如 jrockit,j9根本就没有永久代这个东西。。。

新生代,永久代,方法区只是java虚拟机规范里的官方模型,至于如何去实现,是由生产厂商确定的。。。方法区虽然是堆得一个逻辑部分,但他还有个名字叫做,non-heap。所以跟堆还是不一样的。

而且hotpot把方法区放到永久代去处理不太好,因为永久代有一个参数:-XX:MaxPermSize,这个参数是来描述永久代的内存上限值,这样的话更容易遇到内存溢出的问题,如果物理机内存比较小的时候,这样是肯定会出问题的。。。相反jroket,j9就不会有这样的问题,方法区是用来存类的结构的,比如static变量,常量,jit代码等等,这都是程序代码中非常重要而且是跟着Jvm生命周期一起走得东西,这些要是内存溢出了。。。整个程序就完蛋了~尤其是32bit机。。。本来就不够放对象头对象实例。。。

当然,我想Hotpot这么普及,肯定有我不知道的解决方法或者现在的机器都太好了。。。或者我没有写过大的类导致永久代都不够放~哎~啥时候能让我试试就好了~

你可能感兴趣的:(jvm)