准备在uat环境部署web项目,部署完发现,cpu一直过高,项目访问不了
具体报错:java.lang.OutOfMemoryError: PermGen space
明显一看是方法区满了,但是没有jvm调优经验
经别人指导,看了下服务器的内存,是8G,而该项目jvm配置为
-Xms512m -Xmx3072m -Xss2048K -XX:PermSize=64m -XX:MaxPermSize=64m -XX:-UseGCOverheadLimit
堆内存和方法去内存都很小
这台服务器上布置了四个应用
其他三个配置为
socket项目:
-Xms2048m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
consumer项目:
-Xms512m -Xmx3072m -Xss2048K -XX:PermSize=64m -XX:MaxPermSize=128m -XX:-UseGCOverheadLimit
servcie项目:
-Xms2048m -Xmx4096m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
唯独我新发的项目中方法区和堆内存都很小
所以将web项目配置改成如下:
-Xms2048m -Xmx4096m -Xss2048K -XX:PermSize=128m -XX:MaxPermSize=128m -XX:-UseGCOverheadLimit
最后,web堆内存2G,service2G,socket2G,consumer0.5G< 服务器内存8G
改完参数,系统运行正常了
经过这一次,发现jvm调优相当重要,各种参数都不太懂,大概把用到的列出来
-Xms2048m
-Xms:表示java虚拟机堆区内存初始内存分配的大小,通常为操作系统可用内存的1/64大小即可,但仍需按照实际情况进行分配。有可能真的按照这样的一个规则分配时,设计出的软件还没有能够运行得起来就挂了
-Xmx4096m
-Xmx: 表示java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小。但是开发过程中,通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源。
一般来讲对于堆区的内存分配只需要对上述两个参数进行合理配置即可,但是如果想要进行更加精细的分配还可以对堆区内存进一步的细化,那就 要用到下面的三个参数了-XX:newSize、-XX:MaxnewSize、-Xmn。当然这源于对堆区的进一步细化分:新生代、中生代、老生代。 java中每新new一个对象所占用的内存空间就是新生代的空间,当java垃圾回收机制对堆区进行资源回收后,那些新生代中没有被回收的资源将被转移到 中生代,中生代的被转移到老生代。而接下来要讲述的三个参数是用来控制新生代内存大小的。
1、-XX:newSize:表示新生代初始内存的大小,应该小于 -Xms的值;
2、-XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于 -Xmx的值;
3、-Xmn:至于这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,也就是说如果通过-Xmn来配置新生代的 内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但需要注意的是这个参数是在JDK1.4版本以后才使用的。
上面所述即为java虚拟机对外提供的可配置堆区的参数,接下来讲述java虚拟机对非堆区内存配置的两个参数:
1、-XX:PermSize:表示非堆区初始内存分配大小,其缩写为permanent size(持久化内存)
2、-XX:MaxPermSize:表示对非堆区分配的内存的最大上限。
这里面非常要注意的一点是:在配置之前一定要慎重的考虑一下自身软件所需要的非堆区内存大小,因为此处内存是不会被java垃圾回收机制进行处理的地方。并且更加要注意的是 最大堆内存与最大非堆内存的和绝对不能够超出操作系统的可用内存。
-XX:PermSize=128m
-XX:MaxPermSize=256m
-XX:+DisableExplicitGC 默认启用 禁止在运行期显式地调用System.gc()
-XX:+UseConcMarkSweepGC 默认不启用 启用CMS低停顿垃圾收集器,减少FGC的暂停时间
-XX:+CMSParallelRemarkEnabled 减少第二次暂停的时间,开启并行remark:
-XX:+UseCMSCompactAtFullCollection CMS是不会整理堆碎片的,因此为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项
-XX:LargePageSizeInBytes=128m 默认4m, amd64位:2m 设置堆内存的内存页大小
-XX:+UseFastAccessorMethods 默认启用 优化原始类型的getter方法性能(get/set:Primitive Type)
-XX:+UseCMSInitiatingOccupancyOnly 标志来命令JVM不基于运行时收集的数据来启动CMS垃圾收集周期。而是,当该标志被开启时,JVM通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集,而不仅仅是第一次。然而,请记住大多数情况下,JVM比我们自己能作出更好的垃圾收集决策。因此,只有当我们充足的理由(比如测试)并且对应用程序产生的对象的生命周期有深刻的认知时,才应该使用该标志。
-XX:CMSInitiatingOccupancyFraction=70 该值代表老年代堆空间的使用率。比如,value=75意味着第一次CMS垃圾收集会在老年代被占用75%时被触发。通常CMSInitiatingOccupancyFraction的默认值为68(之前很长时间的经历来决定的)。
相关推荐
给出的标签“源码 工具”表明博文可能还涉及到了分析JVM源代码和使用相关工具进行JVM调优的讨论。 从提供的部分内容来看,提到了Java发展历程、JVM列表、OpenJDK、编译执行过程和JIT编译等。Java的发展历程始于1995...
2. jmap -histo:live <pid>:此命令用于查看当前存活的实例,执行过程中可能会触发一次Full GC。 当需要对JVM进行内存溢出处理时,可以通过两个参数来实现自动导出堆内存信息。这两个参数为: 1. -XX:+...
- **复制算法**(Copying):将内存分为大小相等的两块,每次只使用其中一块,在垃圾回收时,将还活着的对象复制到另一块上面,然后再把已使用过的内存空间一次清理掉。这种算法适用于新生代,因为每次回收都有大量...
- **青年代(Young Generation)**:大部分对象在这里创建并快速死亡,经历一次或几次Minor GC后,存活对象晋升至老年代。 - **老年代(Old Generation)**:长期存活的对象,经历了多次Minor GC后,它们被移动...
在深入讨论JVM(Java虚拟机)调优之前,我们有必要先了解一下虚拟机的基本概念和堆栈...通过上述的分析和总结,我们可以得出,JVM调优是一个涉及多方面知识的复杂过程,需要开发者具备扎实的理论基础和丰富的实践经验。
JVM调优是一个持续的过程,需要根据应用的具体情况进行调整。上述参数只是起点,还需要通过监控工具(如JVisualVM或JConsole)分析GC日志,观察不同GC策略对应用程序的影响,以及内存使用、吞吐量、停顿时间等指标。...
- **示例**:`-XX:MaxTenuringThreshold=0` 表示所有经过第一次Minor GC后存活的对象直接晋升到老年代。 #### 9. -XX:+UseParallelGC 和 -XX:ParallelGCThreads - **定义**: - `-XX:+UseParallelGC` 启用并行...
JVM 调优是 Java 虚拟机(Java Virtual Machine)中的一种技术,用于优化 Java 应用程序的性能和内存使用。其中,垃圾回收(Garbage Collection)是 JVM 调优的重要组成部分,本文将详细介绍 JVM 调优中的垃圾回收...
它负责运行Java应用程序,是Java“一次编写,到处运行”理念的核心。JVM调优是提升Java应用性能的关键步骤,而深入理解Hotspot源码则有助于我们更高效地进行优化工作。以下将详细探讨这些知识点。 1. JVM整体结构...
在对Java虚拟机(JVM)进行调优的过程中,我们首先...总体而言,JVM调优是一个系统化的过程,它需要对JVM的工作机制有深入的理解,并且结合实际应用进行测试和调优。有效的JVM调优能够显著提升Java应用的性能和稳定性。
### jvm调优建议文档知识点解析 #### 一、JVM基本概念及组成部分 - **JVM内存区域划分**:JVM内存分为新生代、老年代以及元空间(Metaspace)三大区域。其中,新生代负责存放新创建的对象,经过多次垃圾回收后存活的...
- **分阶段调优**:逐步进行调优,避免一次性尝试太多变更。 #### 实践 - **内存调优**: - **堆大小调整**:根据应用的实际需求设置合适的堆大小。 - **垃圾收集器选择**:不同类型的垃圾收集器适用于不同的...
大多数对象在Eden区被创建,经过第一次垃圾回收后,仍然存活的对象会被移动到Survivor区之一。 2. 老年代:经历过多次垃圾回收仍存活的对象会晋升到老年代。这个区域的内存回收相对复杂,因为对象生命周期较长,且...
本文将详细解析JVM性能调优分析的过程,并提供常见参数选择配置的建议。 首先,进行JVM参数调优时,我们需要考虑以下几个步骤: 1. **对象占用内存计算**:了解业务系统每秒钟创建的对象数量及其占用的内存空间,...
《lendengine应用JVM调优实践与案例分析》 在现代互联网应用中,JVM调优是一项至关重要的任务,特别是在处理高并发、大数据量的业务场景中。以lendengine为例,其在架构设计中,为了提高日志处理效率,采用了中间件...
Java于1995年发布,其口号“Write Once, Run Anywhere”(一次编写,到处运行)标志着Java的跨平台特性。HotSpot虚拟机在1999年诞生,后成为JDK的默认虚拟机。随着JDK的演进,不断有新的版本发布,例如JDK5(Tiger)...
总结,JVM调优是一项涉及广泛的技术工作,需要深入理解JVM的工作原理,结合实际应用情况,通过不断试验和调整,找到最适合应用的配置。在实践中,持续学习和积累经验,才能更好地提升系统的性能和稳定性。
JVM调优是一个复杂且细致的过程,涉及到内存管理、垃圾回收等多个方面。通过合理的配置JVM参数,可以显著提高应用程序的性能,解决诸如OOM等问题。本文档通过具体的案例分析,介绍了JVM的基本概念、工作原理以及调优...