当前位置:首页 > 后端开发 > java 内存调优

java 内存调优

6个月前 (05-22)67

1、堆大小设置。

2、回收器选择。

1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。

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

一、导致Full GC一般由于以下几种情况:

1、旧生代空间不足

调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象

2、Pemanet Generation空间不足

增大Perm Gen空间,避免太多静态对象

统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间

控制好新生代和旧生代的比例

3、System.gc()被显示调用

垃圾回收不要手动触发,尽量依靠JVM自身的机制

二、主要的调优手段

调优手段主要是通过控制堆内存的各个部分的比例和GC策略来实现,内存比例不良设置会导致一下不良后果:

1). 新生代设置过小

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

2). 新生代设置过大

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

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

3). Survivor设置过小

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

4). Survivor设置过大

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

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

三、新生代和旧生代GC策略和组合搭配:

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

1). 吞吐量优先

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

2). 暂停时间优先

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

四、几种常见的JVM配置原则

1、堆设置

-Xms:初始堆大小

-Xmx:最大堆大小

-XX:NewSize=n:设置年轻代大小

-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2一个Survivor区占整个年轻代的1/5

-XX:MaxPermSize=n:设置持久代大小

2、收集器设置

-XX:+UseSerialGC:设置串行收集器

-XX:+UseParallelGC:设置并行收集器

-XX:+UseParalledlOldGC:设置并行年老代收集器

-XX:+UseConcMarkSweepGC:设置并发收集器

3、垃圾回收统计信息

-XX:+PrintGC

-XX:+PrintGCDetails

-XX:+PrintGCTimeStamps

-Xloggc:filename

4、并行收集器设置

-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。

-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间

-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

5、并发收集器设置

-XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

https://blog.csdn.net/LeegooWang/article/details/88696195

作者:三水工
来源链接:https://blog.csdn.net/weixin_34984850/article/details/114036779

标签: JVM调优

“java 内存调优” 的相关文章

4.JVM面试题

帅地的jvm面试题有点深 1.运行时常量池和符号引用得看看。运行时常量池是方法区的一部分,运行时常量池存放:编译期生成的各种字面量和符号引用 2.jdk1.7 字符串常量池从...

JVM调优理论&实践

JVM调优理论&实践

  目录 1、JVM 参数调优 1.1 堆参数配置 1.2 栈参数配置 1.3 元空间参数配置 1...

IDEA设置多个JVM运行参数

IDEA设置多个JVM运行参数

格式 以-D开头,多个jvm运行参数 用空格隔开 -Dproperty=Value  例如 -Dfile.encoding=UTF-8 -Ds...

jvm-java 内存模型  以及各个分区具体内容

jvm-java 内存模型 以及各个分区具体内容

java内存模型,这里其实是指 jvm运行时内存模型 1 每一个应用程序,都有一个JVM 而不是 多个应用程序,共享一个jvm 2 j...

JVM并发机制的探讨——内存模型、内存可见性和指令重排序

JVM并发机制的探讨——内存模型、内存可见性和指令重排序

【转】http://my.oschina.net/chihz/blog/58035 文章写的非常好,为作者点赞。 JAVA内存模型   对于我们平时开发的业务应用来说...

学习笔记(15):Java系列技术之JVM调优-JVM的总体结构

立即学习:https://edu.csdn.net/course/play/9698/206488?utm_source=blogtoedu 课程笔记关注公众号 :“发...

深入理解JVM(六)JVM调优

深入理解JVM(六)JVM调优

文章目录 1 调优原则 2 何时进行JVM调优 3 JVM调优...

JVM调优定位最耗cpu的线程

JVM调优定位最耗cpu的线程 jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们...

【转】深入理解JVM—JVM内存模型

【转】深入理解JVM—JVM内存模型

原文链接 http://www.cnblogs.com/dingyingsi/p/3760447.html#top   深入理解JVM—JVM内存模型...

使用arthas进行jvm调优

使用arthas进行jvm调优

这里写自定义目录标题 官方用户文档 安装...