JVM调优:PermSpace溢出

引言: 在JVM中, PermSpace主要存放什么信息?如何去理解它的溢出呢?

什么是PermSpace?

   PermSpace主要是存放静态的类信息和方法信息,静态的方法和变量,final标注的常量信息等。

PermSpace溢出的Case 1:

   这里的JDK版本1.6.0_45(jdk7/jdk8不存在类似问题)

 Opertion System: Ubuntu 14.04

  JVM 参数: -Xmx128m -Xms64m -XX:PermSize=5m -XX:MaxPermSize=10M

 利用的原理:在Java中,String类型的常量字符串信息会被存放到PermSpace区域中,形成常量池同时其并不会被GC进行回收,故此利用循环创建常量信息来达到PermSpace溢出的目的。

[java]  view plain  copy
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. public class PermSpaceStringConstant {  
  5.   
  6.     public static void main(String[] args) {  
  7.          List<String> strs = new ArrayList<String>();  
  8.          int i = 0;  
  9.            
  10.          while(true) {  
  11.              strs.add(String.valueOf(i++).intern());   
  12.              System.out.println("We have created " + i + " constant String.");  
  13.          }  
  14.     }  
  15. }   
 运行结果:
   

 

PermSpace溢出的Case 2:

  JVM: jdk1.6.0_45,  Operation System: Ubuntu 14.04

  JVM 参数: -Xmx128m -Xms64m -XX:PermSize=5m -XX:MaxPermSize=5M

 第三方类库: cglib-nodep-3.1.jar

  利用的原理: PermSpace存放类的信息,故此利用cglib动态创建新的类,利用循环创建足够多的类信息,充满PermSpace区域,从而达到溢出PermSpace的目的。

  源代码如下:

[java]  view plain  copy
  1. import java.lang.reflect.Method;  
  2.   
  3. import net.sf.cglib.proxy.Enhancer;  
  4. import net.sf.cglib.proxy.MethodInterceptor;  
  5. import net.sf.cglib.proxy.MethodProxy;  
  6.   
  7. public class CGLibTest {  
  8.   
  9.     public static void main(String[] args) {  
  10.         new CGLibTest().testCGLIB();  
  11.     }  
  12.   
  13.     public void testCGLIB() {  
  14.      int i = 0;  
  15.      while(true) {  
  16.         Enhancer enhancer = new Enhancer();  
  17.         enhancer.setSuperclass(EnhancerTest.class);  
  18.         enhancer.setCallback(new MethodInterceptorImpl());  
  19.   
  20.         EnhancerTest demo = (EnhancerTest) enhancer.create();  
  21.         //demo.test();  
  22.         //System.out.println(demo);  
  23.         System.out.println("Create " + (i++) +" instance:" + demo.getClass().getSimpleName());  
  24.      }  
  25.     }  
  26.       
  27.     static class EnhancerTest {  
  28.            
  29.     }  
  30.   
  31.     private static class MethodInterceptorImpl implements MethodInterceptor {  
  32.         @Override  
  33.         public Object intercept(Object obj, Method method, Object[] args,  
  34.                 MethodProxy proxy) throws Throwable {  
  35.             //System.err.println("Before invoke " + method);  
  36.             Object result = proxy.invokeSuper(obj, args);  
  37.             //System.err.println("After invoke" + method);  
  38.             return result;  
  39.         }  
  40.     }  
  41. }  

运行结果:

 


 总结:

   通过以上2个Cases来分析,可以更加深刻的了解PermSpace所存放的信息内容了:类信息和常量静态的信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值