内存调优

本文介绍了JVM内存调优的基本原则与方法,包括如何合理设置新生代与老年代的比例,选择合适的GC策略,以及避免Full GC的发生。还提供了具体的JVM参数配置建议。
首先需要注意的是在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数,过多的GC和Full GC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量。特别要关注Full GC,因为它会对整个堆进行整理,导致Full GC一般由于以下几种情况:

•旧生代空间不足
调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象
•Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象
•统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
控制好新生代和旧生代的比例
•System.gc()被显示调用
垃圾回收不要手动触发,尽量依靠JVM自身的机制
调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,下面来看看各部分比例不良设置会导致什么后果

1)新生代设置过小

一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC

2)新生代设置过大

一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加

一般说来新生代占整个堆1/3比较合适

3)Survivor设置过小

导致对象从eden直接到达旧生代,降低了在新生代的存活时间

4)Survivor设置过大

导致eden过小,增加了GC频率

另外,通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,尽量让对象在新生代被回收

由上一篇博文JVM学习笔记(三)------内存管理和垃圾回收可知新生代和旧生代都有多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,JVM提供两种较为简单的GC策略的设置方式

1)吞吐量优先

JVM以吞吐量为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,来达到吞吐量指标。这个值可由-XX:GCTimeRatio=n来设置

2)暂停时间优先

JVM以暂停时间为指标,自行选择相应的GC策略及控制新生代与旧生代的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。这个值可由-XX:MaxGCPauseRatio=n来设置

最后汇总一下JVM常见配置

1.堆设置
1.-Xms:初始堆大小
2.-Xmx:最大堆大小
3.-XX:NewSize=n:设置年轻代大小
4.-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
5.-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
6.-XX:MaxPermSize=n:设置持久代大小
2.收集器设置
1.-XX:+UseSerialGC:设置串行收集器
2.-XX:+UseParallelGC:设置并行收集器
3.-XX:+UseParalledlOldGC:设置并行年老代收集器
4.-XX:+UseConcMarkSweepGC:设置并发收集器
3.垃圾回收统计信息
1.-XX:+PrintGC
2.-XX:+PrintGCDetails
3.-XX:+PrintGCTimeStamps
4.-Xloggc:filename
4.并行收集器设置
1.-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
2.-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
3.-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
5.并发收集器设置
1.-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
2.-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)内容概要:本文围绕基于改进粒子群算法的无人机路径规划展开研究,重点探讨了在复杂环境中利用改进粒子群算法(PSO)实现无人机三维路径规划的方法,并将其与遗传算法(GA)、标准粒子群算法等传统化算法进行对比分析。研究内容涵盖路径规划的多目标化、避障策略、航路点约束以及算法收敛性和寻能力的评估,所有实验均通过Matlab代码实现,提供了完整的仿真验证流程。文章还提到了多种智能化算法在无人机路径规划中的应用比较,突出了改进PSO在收敛速度和全局寻方面的势。; 适合人群:具备一定Matlab编程基础和化算法知识的研究生、科研人员及从事无人机路径规划、智能化算法研究的相关技术人员。; 使用场景及目标:①用于无人机在复杂地形或动态环境下的三维路径规划仿真研究;②比较不同智能化算法(如PSO、GA、蚁群算法、RRT等)在路径规划中的性能差异;③为多目标化问题提供算法选型和改进思路。; 阅读建议:建议读者结合文中提供的Matlab代码进行实践操作,重点关注算法的参数设置、适应度函数设计及路径约束处理方式,同时可参考文中提到的多种算法对比思路,拓展到其他智能化算法的研究与改进中。
### JVM 内存指南 JVM 内存Java 应用程序性能和稳定性的关键步骤。通过合理配置 JVM 内存参数,可以显著提升应用的响应速度、吞吐量,并减少垃圾回收(GC)停顿时间。以下是一些常见的 JVM 内存方法和最佳实践。 #### 堆内存设置 堆内存JVM 中用于对象分配的主要内存区域。合理设置堆内存大小可以避免频繁的垃圾回收操作。通常,可以通过以下参数来设置堆内存: - `-Xms`:设置 JVM 初始堆内存大小。 - `-Xmx`:设置 JVM 最大堆内存大小。 对于具有 8 核心和 32GB 内存的机器,推荐的堆内存设置可以是: ```shell -Xms4g -Xmx8g ``` 这表示初始堆内存为 4GB,最大堆内存为 8GB。这样的设置可以确保应用有足够的内存来处理负载,同时避免占用过多系统资源[^1]。 #### 垃圾回收器选择 选择合适的垃圾回收器对于化应用性能至关重要。JVM 提供了多种垃圾回收器,每种回收器适用于不同的应用场景: - **Serial GC**:适用于单线程应用。 - **Parallel GC**:适用于多线程应用,注重吞吐量。 - **CMS GC**:适用于低延迟要求的应用。 - **G1 GC**:适用于大堆内存应用,平衡吞吐量和延迟。 例如,使用 G1 垃圾回收器的参数设置如下: ```shell -XX:+UseG1GC ``` G1 GC 能够有效地管理大堆内存,并且在大多数情况下提供较低的延迟[^1]。 #### 元空间设置 在 JVM 8 及更高版本中,元空间(Metaspace)取代了永久代(PermGen)。元空间用于存储类的元数据信息。可以通过以下参数来设置元空间: - `-XX:MetaspaceSize`:设置元空间初始大小。 - `-XX:MaxMetaspaceSize`:设置元空间最大大小。 例如: ```shell -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m ``` 这表示初始元空间为 256MB,最大元空间为 512MB。这样的设置可以避免元空间占用过多内存,同时确保应用有足够的空间来加载类[^1]。 #### 垃圾回收日志记录 启用垃圾回收日志记录可以帮助分析和化垃圾回收性能。可以通过以下参数来启用垃圾回收日志记录: ```shell -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log ``` 这些参数会记录详细的垃圾回收信息到指定的日志文件中,便于后续分析。 #### 线程栈大小设置 线程栈大小影响应用的并发能力和内存使用。可以通过以下参数来设置线程栈大小: - `-Xss`:设置每个线程的栈大小。 例如: ```shell -Xss512k ``` 这表示每个线程的栈大小为 512KB。较小的栈大小可以增加并发线程数,但可能会导致栈溢出问题。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值