从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数
内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费。内存泄漏最终会导致OOM。 造成内存泄漏典型场景: 1. 单例模式的不正确使用单例对象在初始化后将在JVM的整个生命周期中以静态变量的方式存在。如果单例对象持有对外部对象的引用,那么这个对象将不能被JVM正常回收 2. 数据库、网络、IO连接没有被关闭释放这类连接,一般会提供close方法进行显式关闭。但如果没有进行close,是不会自动被gc回收的。3.不合适的对象引用 比如,生命周期长的对象持有生命周期短的对象的引用就很容易造成内存泄漏,尽管生命周期短的对象已经不再需要,但是因为生命周期长的对象持有对它的引用而导致不能被回收。 内存溢出 内存溢出即out of memory简称OOM。当程序申请内存时,没有足够的内存空间供其使用,往往会出现OOM。比如申请了一个Integer,但给它存了Long类型才能存下的数,那就会导致内存溢出。 堆外内存 关于堆内内存以及相应的内存回收策略,在之前的文章《JVM内存管理和垃圾回收》、《JVM垃圾回收器、内存分配与回收策略》中已有介绍。对于堆外内存是指分配的对象直接受操作系统管理的JVM内存堆以外的空间。同时因为这部分区域直接受操作系统的管理,别的进程可以直接通过操作系统对其进行访问,减少了从JVM中复制数据的过程。 堆外内存适用生命周期较长的对象,具有以下特点:
但也存在如下缺点:
常用JVM配置参数 -Xms:JVM初始最小堆内存 -Xmx:JVM允许最大堆内存 -XX:PermSize:JVM初始非堆内存 -XX:MaxPermSize:JVM允许最大的非堆内存 -XX:+UseConcMarkSweepGC:年老代激活CMS收集器,可以尽量减少fullGC -XX:+UseParNewGC:设置年轻代为多线程并行收集 -XX:+UseCMSCompactAtFullCollection:在full gc时,对老年代的压缩(CMS的时候,会导致内存碎片,使内存空间不连续,可能会影响性能,但是可以消除碎片) -XX:CMSInitiatingOccupancyFraction:当老年代被占用空间达到一定比例时触发CMS垃圾收集 -Xverify:none:类加载的时候关闭字节码验证 -XX:+DisableExplicitGC:告诉JVM关掉System.gc -XX:+CMSParallelRemarkEnabled:再标记算法,降低标记停顿时间 -XX:+PrintHeapAtGC:打印GC前后的详细堆栈信息,主要用于生产环境或者压力测试时候看的信息 -XX:+PrintGCTimeStamps:输出GC的时间戳 -XX:PretenureSizeThreshold:使大对象直接进入老年代 JVM内存管理和垃圾回收 JVM垃圾回收器、内存分配与回收策略 ? ? 关注微信公众号:大数据学习与分享,获取更对技术干货 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java中的Matrix类
- Android系统下检测Wifi连接互联网是否正常的代码
- 为什么Java 9不会简单地将类路径上的所有JAR转换为自动模块
- Java ServiceLoader在开发期间如何工作? (构建JAR之前的单
- 如何在Java中永远运行程序? System.in.read()是唯一的方法
- java – 使用Hibernate Criteria API编写HQL子句
- java – 使用OSGi实现自动更新
- java – 玩! Framework 2.0适合创建REST API?
- java – Solr Filter Cache(FastLRUCache)占用太多内存并导
- java – 在clojure中,是(=’a’a)指的是’同一个原子’?