从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数
内存泄漏
内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费。内存泄漏最终会导致OOM。
造成内存泄漏典型场景:
1. 单例模式的不正确使用单例对象在初始化后将在JVM的整个生命周期中以静态变量的方式存在。如果单例对象持有对外部对象的引用,那么这个对象将不能被JVM正常回收
2. 数据库、网络、IO连接没有被关闭释放这类连接,一般会提供close方法进行显式关闭。但如果没有进行close,是不会自动被gc回收的。3.不合适的对象引用
比如,生命周期长的对象持有生命周期短的对象的引用就很容易造成内存泄漏,尽管生命周期短的对象已经不再需要,但是因为生命周期长的对象持有对它的引用而导致不能被回收。
内存溢出
内存溢出即out of memory简称OOM。当程序申请内存时,没有足够的内存空间供其使用,往往会出现OOM。比如申请了一个Integer,但给它存了Long类型才能存下的数,那就会导致内存溢出。
堆外内存
关于堆内内存以及相应的内存回收策略,在之前的文章《JVM内存管理和垃圾回收》、《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优化参数配置参数的更多相关文章
- Java堆外内存之六:堆外内存溢出问题排查
一.堆外内存组成 通常JVM的参数我们会配置 -Xms 堆初始内存 -Xmx 堆最大内存 -XX:+UseG1GC/CMS 垃圾回收器 -XX:+DisableExplicitGC 禁止显示GC -X ...
- Netty堆外内存泄露排查与总结
导读 Netty 是一个异步事件驱动的网络通信层框架,用于快速开发高可用高性能的服务端网络框架与客户端程序,它极大地简化了 TCP 和 UDP 套接字服务器等网络编程. Netty 底层基于 JDK ...
- Java堆外内存管理
Java堆外内存管理 1.JVM可以使用的内存分外2种:堆内存和堆外内存: 堆内存完全由JVM负责分配和释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemo ...
- Java堆外内存之三:堆外内存回收方法
一.JVM内存的分配及垃圾回收 对于JVM的内存规则,应该是老生常谈的东西了,这里我就简单的说下: 新生代:一般来说新创建的对象都分配在这里. 年老代:经过几次垃圾回收,新生代的对象就会放在年老代里面 ...
- Spring Boot引起的“堆外内存泄漏”排查及经验总结
小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...
- 【转】Java学习---内存泄露与溢出的区别
Java内存泄露与溢出的区别 Java内存泄漏就是没有及时清理内存垃圾,导致系统无法再给你提供内存资源(内存资源耗尽): 而Java内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于 ...
- JVM源码分析之堆外内存完全解读
JVM源码分析之堆外内存完全解读 寒泉子 2016-01-15 17:26:16 浏览6837 评论0 阿里技术协会 摘要: 概述 广义的堆外内存 说到堆外内存,那大家肯定想到堆内内存,这也是我们 ...
- Spring Boot引起的“堆外内存泄漏”排查及经验总结 strace
小结: 检索词:C++内存分配器.jvm内存模型.gdb.内存泄露 https://tech.meituan.com/2019/01/03/spring-boot-native-memory-leak ...
- cassandra 堆外内存管理
为什么需要堆外内存呢 单有一些大内存对象的时候,JVM进行垃圾回收时需要收集所有的这些对象的内存也.增加了GC压力.因此需要使用堆外内存. java 分配堆外内存 org.apache.cassand ...
随机推荐
- 为什么layui表单不显示?
当你使用表单时,Layui会对select.checkbox.radio等原始元素隐藏,从而进行美化修饰处理.但这需要依赖于form组件,所以你必须加载 form,并且执行一个实例.值得注意的是:导航 ...
- 内网渗透 day2-nmap和nc的使用
nmap和nc的使用 nmap的使用 1. nmap -sSV 172.16.100.214 -T4 -F -sS进行SYN扫描,是比较隐匿的 -sV探测打开端口的服务的信息 -sSV将上面两种一起使 ...
- 消失的两个数字(1-N缺两个数)
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字.你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可. 示例 1: 输入: [1]输出: [2,3 ...
- 利用matlibplot绘制雷达图
之前在一些数据分析案例中看到用 Go 语言绘制的雷达图,非常的漂亮,就想着用matlibplot.pyplot也照着画一个,遗憾的是matlibplot.pyplot模块中没有直接绘制雷达图的函数,不 ...
- Innodb表空间迁移过程
1.大致流程 将a实例的表的数据迁移到b实例上. 1.在目标实例b上创建一个相同的表 2.在目标库b上执行ALTER TABLE t DISCARD TABLESPACE; 3.在源库a上执行FLUS ...
- Python_微信开发
<!-- 发消息功能 --> 0.微信开发的2个库 pip install werobot pip install 1.新建项目 2.项目下新建 robot 的app 3.写robot.p ...
- js常用通用函数
//判断是否数字 function isNumber(str){ var n = Number(str); if (!isNaN(n)){ return true; }else{ return fal ...
- 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记
动机 TRPG Engine经过长久以来的迭代,项目已经显得非常臃肿了.数分钟的全量编译, 每次按下保存都会触发一次10s到1m不等的增量编译让我苦不堪言, 庞大的依赖使其每一次编译都会涉及很多文件和 ...
- 面试阿里,字节跳动,华为必须知道的Java创建对象的5种方式
Java创建对象的5种方式 1.直接new,调用了构造器2.通过clone(),没有调用构造器3.通过反射,调用了构造器4.通过反序列化,没有调用构造器5.通过Unsafe类的allocateInst ...
- 使用思维导图MindManager能否增强记忆?
学生时代,每当面对冗杂的需要背诵的课业时,有很多人都会发出"这么多内容怎么背啊"."我讨厌死记硬背"."昨天背完今天就忘了"的呐喊.那么,如 ...