07JVM架构(016)_java内存如何优化

转载 2016年08月30日 15:42:43

1、java内存如何优化

了解jvm内存管理看这里:jvm是如何管理内存的 
了解堆内存看这里:java堆内存是什么样的 
java内存的优化主要是通过合理的控制GC来实现,主要原则: 
1. 不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况(因为GC过后这个值是不会变化的)。 
2. 使用JDK提供的内存查看工具,比如JConsoleJava VisualVM。 
3. 优化内存主要的目的是降低youngGC的频率减少fullGC的次数 ,过多的youngGC和fullGC是会占用很多的系统资源(主要是CPU),影响系统的吞吐量

这里,影响内存效率最关键的就是:fullGC,因为它会对整个堆内存进行整理,占用大量的资源。

2、FullGC何时发生

fullGC作为java内存管理的关键,它的触发时机我们一定要掌握,有4种情况会发生fullGC:

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

  2. Pemanet Generation空间不足 
    增大Perm Gen空间,避免太多静态对象。了解内存溢出看这里:java什么情况会内存溢出

  3. GC后晋升到老生代的平均大小大于老生代剩余空间 
    控制好新生代和旧生代的比例

  4. System.gc()被显示调用 
    垃圾回收不要手动触发,尽量依靠JVM自身的机制。

3、GC有哪些优化手段

GC调优手段主要是通过控制堆内存的各个部分比例,以及根据不同场景采用不同的GC策略来实现。下面分别来看:

通过控制堆内存比例优化GC

  1. 新生代设置过小 
    一是新生代容易占满,导致新生代GC(youngGC)次数非常频繁,增大系统消耗; 
    二是大对象直接进入老生代,占据了老生代剩余空间,诱发fullGC。 
    了解youngGC和FullGC看这里:fullGC、minorGC、magorGC有什么区别
  2. 新生代设置过大 
    一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发fullGC。 
    二是新生代GC耗时大幅度增加。 
    一般说来新生代占整个堆1/3比较合适。

  3. Survivor设置过小 
    新生代中根据优化复制算法,如果Survivor区(S0,S1)太小,会导致对象从eden区直接到达旧生代,降低了在新生代的存活时间。一般来说Eden:S0:S1为8:1:1是比较合理的。 
    了解新生代复制算法看这里:什么是新生代的复制算法

  4. Survivor设置过大 
    若Survivor区过大,则eden区会过小,eden区容易达到阈值导致新生代GC频率增加

  5. 新生代对象存活时间过短 
    通过-XX:MaxTenuringThreshold=n来控制新生代存活时间,如果存活时间过短,则对象会很快进入老生代,导致fullGC。所以要尽量让不常用对象在新生代被回收

通过GC策略优化GC

新生代和旧生代都有很多种GC策略和组合搭配,选择这些策略对于我们这些开发人员是个难题,默认情况下JVM会自动调整新生代与老生代的比例、Eden区与Suvivor区的比例来达到性能目标,JVM提供两种较为简单的GC策略的设置方式:

  1. 吞吐量优先 
    JVM以吞吐量为指标,自行选择相应的GC策略及 控制堆内存的大小比例,来达到吞吐量指标。一次fullGC时间占总可用时间的比例,如果GC时间过长,会相应调整空间的大小(花费在GC上的时间比例不超过1 / (1 + n))。 
    通过-XX:GCTimeRatio=n来设置。

  2. 暂停时间优先 
    JVM以暂停时间为指标,自行选择相应的GC策略及控制堆内存的大小比例,尽量保证每次GC造成的应用停止时间都在指定的数值范围内完成。如果时间过长,会相应调整空间的大小(单位是毫秒)。 
    通过-XX:MaxGCPauseMillis=n来设置。

Java千百问_07JVM架构(016)_java内存如何优化

点击进入_更多_Java千百问1、java内存如何优化了解jvm内存管理看这里:jvm是如何管理内存的 了解堆内存看这里:java堆内存是什么样的 java内存的优化主要是通过合理的控制GC来实现...
  • ooppookid
  • ooppookid
  • 2016年06月04日 07:57
  • 6266

Unity3d 如何优化内存

前言:一提到内存这个东西我相信很多做技术的都头大,我也不例外,如何平衡内存值和手游的表现真的是需要去反反复复去琢磨的。下面记录下我们游戏的内存优化以及一些技巧 首先我们需要一个目标,也就是我们需要把我...
  • pdw_jsp
  • pdw_jsp
  • 2017年04月01日 17:46
  • 692

大型Java Web项目的架构和部署调优问题

一位ID是jackson1225的网友在javaeye询问了一个大型Web系统的架构和部署选型问题,希望能提高现有的基于Java的Web应用的服务能力。由于架构模式和部署调优一直是Java社区的热门话...
  • u011599900
  • u011599900
  • 2014年04月09日 23:20
  • 2136

架构师之路:JAVA高并发高性能高可用高扩展架构性能优化系列课程

架构师之路:JAVA高并发高性能高可用高扩展架构性能优化系列课程 随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到程序开发的,有没有一些基础性的资料给我们学习学习呢,你的框架...
  • cadn_jueying
  • cadn_jueying
  • 2017年11月23日 20:36
  • 223

Java内存模型及性能优化及Java垃圾回收

Java内存模型及性能优化及Java垃圾回收
  • mine_song
  • mine_song
  • 2017年03月09日 08:47
  • 819

java内存优化-程序监控

java内存优化-程序监控---------jconsole.exe,jvisualVM.exe 的使用
  • zzqxf1314
  • zzqxf1314
  • 2016年04月12日 10:23
  • 46

深入浅出:CPU,GPU,内存的优化

营养非常丰富的一篇文章,原文:http://www.cnblogs.com/murongxiaopifu/p/4284988.html 阅读目录 前言:看看优化需要从哪里着手C...
  • cordova
  • cordova
  • 2016年08月18日 15:28
  • 4687

linux—优化和内存屏障

一、设置屏障的原因 我们编程时,指令一般不会按照它们在源程序的顺序执行。原因是计算机为了提高程序执行的性能,会对它进行优化,这种优化主要有两种: 1.编译器的优化:为了提高系统的性能,编译器在不影...
  • qq_34665912
  • qq_34665912
  • 2016年04月19日 17:03
  • 393

Struts2 S2-016,S2-017远程代码执行漏洞解决,修复

Struts2 S2-016,S2-017远程代码执行漏洞解决,修复 官网描述如下: http://struts.apache.org/release/2.3.x/docs/s2-016.html ...
  • yx13649017813
  • yx13649017813
  • 2015年03月26日 10:55
  • 3313

U3D内存优化之(四)

Unity开发者的C#内存管理(中篇) 第一篇介绍了在 .NET/Mono 和Unity里内存管理的基础,并且提供了一些避...
  • ywjun0919
  • ywjun0919
  • 2016年02月18日 19:25
  • 3499
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:07JVM架构(016)_java内存如何优化
举报原因:
原因补充:

(最多只允许输入30个字)