深入理解_jvm内存管理调优案例分析与实战10

author author     2022-09-05     751

关键词:

1、高性能硬件上的程序部署策略
目前常用2种方式:
(1)通过64位JDK来使用大内存:
     使用第一种方式关键:
          <1>控制应用程序的Full GC频率。譬如10多个小时甚至一天才出现一次Full GC。
               关键:大多数对象的生存时间不应该太长,保证老年代空间的稳定。
               在大多数网站形势的应用里,主要对象的生存周期都是请求级或页面级的,会话级和全局级的长生命对象相对较少,控制住Full GC。
     需要考虑的问题:
          <1>内存回收导致的长时间停顿;
          <2>现阶段,64位JDK的性能测试结果普遍低于32位JDK;
          <3>需要保证程序稳定,因为这种方式产生堆溢出几乎就无法产生堆转储快照;
          <4>相同程序在64位JDK中消耗的内存一般比32位JDK大,这是由于指针膨胀及数据类型对齐补白等因素导致。
(2)使用若干32位虚拟机逻辑集群来利用硬件资源:(现在阶段常采用的方案)
     具体做法:
          <1>启用多个应用服务器进程,给每个服务器进程分配不同的端口;
          <2>前端搭建一个负载均衡器,利用反向代理的方式来分配访问请求。
     可能会遇到的问题:
          <1>尽量避免节点竞争全局的资源,最典型的就是磁盘竞争;
          <2>很难最高效率地利用某些资源池,譬如连接池,一般都是在各个节点建立自己的独立的资源池,导致一些节点资源池满了而另外一些节点仍有比较多的空余。尽量使用集中式的JNDI。
          <3>各个节点仍然不可避免的受到32位的内存限制;
          <4>大量使用本地缓存(如大量使用HashMap作为K/V缓存)的应用,在逻辑集群中会造成较大的内存浪费,因为每个逻辑节点上都有一份缓存,这时可以考虑把本地缓存改为集中式缓存。
 
2、集群间同步导致的内存溢出
3、堆外内存导致的溢出错误
问题现象:
     <1>不定时抛出内存溢出异常;
     <2>加入:-XX:+HeapDumpOnOutOfMemoryError,没有任何反应,抛出内存溢出异常时什么文件都没有产生。
找出问题:
     <1>使用jstat实时监控,仍然很正常;
     <2>最后通过系统日志找到异常堆栈。
分析错误原因:
     <1>32位windows平台,内存限制2GB,其中java堆分配了1.6GB,而Direct Memory(参见《深入理解JVM内存管理_1、运行时数据区域》中的直接内存部分的介绍)并不算在1.6GB的堆之内,只有去剩下的0.4GB中分配;
     <2>垃圾收集进行时,虚拟机虽然会对Direct Memory继续回收,但是Direct Memory却不像新生代和老年代那样,发现空间不足就通知收集器进行垃圾回收,它只能等待老年代满了之后Full GC,然后随便帮它清理内存的废弃对象。否则,它只能等到抛出内存溢出异常时,先catch掉,再在catch块里面大喊一声“System.gc()”。要是虚拟机还是不听(譬如打开:-XX:+DisableExplicitGC开关),那就只能看着堆中还有许多空闲内存,自己却不得不抛出内存溢出异常了。
通过问题得到的启示:
     <1>Direct Memory:可通过-XX:MaxDirectMemorySize调整大小,内存不足时抛出OutOfMemoryError或OutOfMemoryError:Direct buffer memory。
     <2>线程堆栈:可通过-Xssz调整大小,内存不足时抛出StackOverFlowError(纵向无法分配,即无法分配新的栈帧)或者OutOfMemoryError:unable to create new native thread(横向无法分配,即无法建立新的线程。)
     <3>Socket缓存区:每个Socket连接都Receive和Send两个缓存区,分别占大约37K和25K的内存,连接多的话这块内存占用也比较客观,如果无法分配,抛出:IOException:Too many open file异常。
     <4>JNI代码:如果代码中使用JNI调用本地库,那本地库使用的内存也不在堆中。
     <5>虚拟机和GC:虚拟机和GC的代码执行也要消耗一定的内存。
 
4、外部命令导致系统缓慢:
问题现象:
     <1>CPU使用率很高,而且发现并不是user应用占用的高。
     <2>发现是“fork”系统调用,“fork”系统调用时Linux用来产生新进程的。在java虚拟机中,java代码最多只产生线程,不应当有进程的产生。
找出问题:
     <1>使用java的Runtime.getRuntime().exec()来调用shell脚本来获取系统信息,该方式非常消耗CPU和内存。
解决办法:
     通过java的API来获取系统信息即可。
 
5、服务器JVM进程崩溃:
问题现象:
     <1>集群节点的虚拟机进程自动关闭的现象。
     <2>异常:java.net.SocketException:Connection reset
找出问题:
     <1>两个系统之间需要同步信息,而两个系统的响应速度不对称(尽管使用了异步的机制),导致主动发起请求(且速度快的系统)时间越长就累计了越多的服务没有调用完成,在等待的线程和Socket连接越来越多,最终超过了虚拟机的承受能力后使虚拟机进程崩溃。
解决办法:
     将异步调用模式改为生产者/消费者模式的消息队列实现后,系统恢复正常。 

深入理解jvm——jvm性能调优实战

如何在高性能服务器上进行JVM调优;以便充分利用高性能服务器的硬件资源,有两种JVM调优方案。一、       采用64位操作系统,并为JVM分配大内存分析:如果JVM中堆内存太小,那么就会频繁地发生垃圾... 查看详情

深入浅出java!对java内存模型的理解

二、六大性能调优技术(JVM调优+网络调优+数据库调优+LINUX内核调优+中间件底层探索+容器环境调优)手绘板(脑图)1、JVM调优JVM调优必备理论知识-GcCOLLECTOR-三色标记垃圾回收算法串讲JVM常见参数... 查看详情

深入理解java虚拟机(jvm性能调优+内存模型+虚拟机原理)

课程大纲:第1节说在前面的话  00:05:07分钟第2节整个部分要讲的内容说明  00:06:58分钟第3节环境搭建以及jdk,jre,jvm的关系  00:20:48分钟第4节jvm初体验-内存溢出问题的分析与解决  00:17:59分钟第5节jvm再... 查看详情

深入理解java虚拟机(jvm性能调优+内存模型+虚拟机原理)

 课程大纲:第1节说在前面的话  00:05:07分钟第2节整个部分要讲的内容说明  00:06:58分钟第3节环境搭建以及jdk,jre,jvm的关系  00:20:48分钟第4节jvm初体验-内存溢出问题的分析与解决  00:17:59分钟第5节jvm... 查看详情

深入理解java虚拟机:jvm内存管理与垃圾收集理论(代码片段)

文章目录阅读的疑问???第二部分自动内存管理第2章Java内存区域与内存溢出异常1.程序计数器2.Java虚拟机栈3.本地方法栈4.Java堆5.方法区6.直接内存(我理解就是堆外内存吧)HotSpot虚拟机对象探秘1.对象的创... 查看详情

深入理解java虚拟机第二部分.内存自动管理机制.5.调优实战

高性能硬件上的程序部署策略在高性能硬件上部署程序,目前主要有两种方式:  通过64位JDK来使用大内存。    -- 缺点:GC停顿时间长  使用若干个32位虚拟机建立逻辑集群来利用硬件资源。  --思想:分治... 查看详情

深入理解jvm之知识体系(代码片段)

一.JVM知识体系组成1.JVM内存区域(1)组成部分(2)各部分的作用2.JVM内存溢出(1)内存溢出(2)栈溢出(3)内存区域与溢出的关联3.垃圾回收机制(1)对象存活状态判断(2)垃圾收集算法(3)垃圾收集器(4)垃圾回收过程4.类加载(1)类的生命周期(2)类... 查看详情

深入理解_jvm内存管理典型配置举例09

以下配置主要针对分代垃圾回收算法而言:1、堆大小设置:   年轻代的设置很关键JVM中最大堆大小有三方面限制:   (1)相关操作系统的数据模型(32-bt还是64-bit)限制;   (2)系统的可用虚... 查看详情

深入理解_jvm内存管理内存分配和回收策略06

解决两个问题:   1、对象分配内存;   2、回收分配给对象的内存。本节详细讲解分配的问题:名词解释:新生代GC(MinorGC):指发生在新生代的垃圾回收动作,非常频繁,回收速度很快。老生代GC(MajorGC/FullGC)... 查看详情

java系列文章(全)

...验器JVM系列:安全管理器JVM系列:策略文件Java垃圾回收机制深入剖析Classloader(一)--类的主动使用与被动使用深入剖析Classloader(二)-根类加载器,扩展类加载器与系统类加载器深入理解JVM—JVM内存模型JVM-堆与栈JVM调优总结-基本垃圾... 查看详情

jvm性能监控与gc调优(代码片段)

...2.1类加载信息2.2垃圾回收信息2.3JIT编译信息3.jmap+MAT分析内存溢出[实战]3.1模拟内存溢出3.2导出内存影像文件3.3使用MAT分析dump文件4.jstack分析死循环与死锁[实战]三基于JVisualVM的可视化监控四基于 查看详情

深入理解jvm:outofmemory实战

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM),下面我们来详细分析。Java堆溢出Java堆用于存储对象实例,只要不断的创建对象,并且保证GCRoots到对象之间有可达路径... 查看详情

《深入理解jvm——gc算法与内存分配策略》

 JVM深入理解JVM(2)——GC算法与内存分配策略 PostedbyCrowonAugust10,2017说起垃圾收集(GarbageCollection,GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行... 查看详情

《深入理解jvm——gc算法与内存分配策略》(代码片段)

 JVM深入理解JVM(2)——GC算法与内存分配策略 PostedbyCrowonAugust10,2017说起垃圾收集(GarbageCollection,GC),想必大家都不陌生,它是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行... 查看详情

深入理解jvm

1.java内存模型?2.oom?3.导致fullGc?4.如何调优? 查看详情

深入jvm系列之gc机制收集器与gc调优

...分配须要了解很多其它内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配1.1、内存分配:1、对象优先在EDEN分配2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4、适龄对象也可能进入... 查看详情

jvm性能调优实战-61常用的jvm调优网站

文章目录线程Dump日志分析堆Dump可视化分析GC日志分析AlibabaArthasAliabbajvmGeneratePerfMaPerfMa-XXFox(Java虚拟机参数分析)PerfMa-XSheepdog(Java线程Dump分析)PerfMa-XElephant(Java内存Dump分析)线程Dump日志分析https://fastthread.io在线的 查看详情

深入jvm系列之gc机制收集器与gc调优(转)

...分配 需要了解更多内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配  1.1、内存分配:1、对象优先在EDEN分配2、大对象直接进入老年代 3、长期存活的对象将进入老年代 4、适龄对象也... 查看详情