1.内存中加载的数据量过大。
比如一次性从数据库加载过多的数据。
2.并发数量太高。
并发数量太高,导致在短时间内创建大量的对象,GC也不及回收。
3.集合类中有无用对象的引用,使用完后没有立即清除。
集合类中的对象,如果不手动进行清除,GC不是不会对集合中无用的对象进行回收。
4.代码中存在死循环,递归,或者循环次数过多产生大量的对象。
5.方法区内存溢出。
方法区存放的是Class类型信息,类名,常量池,修饰符,方法描述等信息。
使用了过多的静态变量。常量池也被大量的占用。
jvm在“运行期间” 产生了大量的类。导致填满了方法区。比如使用反射,动态代理,字节码生成技术会在运行期间产生大量的类和类型信息。如hibernate,spring第三方框架大量使用了cglib技术产生大量的动态类。
大量的jsp在编译生成java类时也有可能产生方法区溢出,GC对方法区的回收非常苛刻的,因为对于一个类的回收条件就很严格。
6.启动时JVM内存参数设置过小。
转载于:https://my.oschina.net/u/3409639/blog/879343