我164g内存能玩什么游戏玩很大型游戏有时有一点点卡顿,这时加内存条有没有缓解作用?

电脑加了内存条速度一定会变快吗、_百度知道
电脑加了内存条速度一定会变快吗、
还是跟别的还有关系,需要知道我电脑的配置吗,
我有更好的答案
笔记本卡顿不顺畅跟有的品牌有关系,还是做工精细的问题。有的品牌低配也很顺,有的品牌就卡慢。国产品牌用过的华硕就是,看配置表应该可以了但用起来还是卡,外国品牌就好些。比如用过的惠普配置不高就没卡顿过。国内还是要买一线品牌,如联想用起来的就好些。有的加了大内存还是卡慢的。
电脑速度和CPU、内存、主板、显卡、硬盘都有关系的,一般你装WIN7的话2G内存就够了,除非你玩很大型的游戏才需要再加内存,若加了速度也不会快还浪费钱!
还需要CPU频率够高,硬盤转速够快,显卡够好。如果这三点都可以就内存不够那麼恭喜你,它是可以变快的。
运行小程序可能没有区别,运行需要大容量内存的程序,优势就体现出来了。可以看下你的具体配置。
会的,再加上独立显卡总快。
其他3条回答
为您推荐:
其他类似问题
您可能关注的内容
内存条的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。难道4g内存就真的对gta5一点办法都没有吗??越玩越卡的情况就命中注定吗?_百度知道
难道4g内存就真的对gta5一点办法都没有吗??越玩越卡的情况就命中注定吗?
我有更好的答案
根据steam上配置推荐,4G作为最小配置,还是可以玩的。但是,可以看到对CPU的要求还是比较高的,需要4核2.4GHz的CPU。
我4g内存玩那么久都不见卡
我基本半个小时就不行了。。你其他配置是什么
你是不是开太多东西了
还是说你画面调很低
也不是多好
我就知道,可是我的配置我在gta5官网侧过能开中的啊,我只不过开中高而已,到也不至于这样吧
除非开车快快的或在草很多的地方才会卡
在买条内存不行了也不贵
开车快会卡。。。你说的真轻巧。。。难不成你都是龟速行驶?
什么意思,就是开超跑在地图猛跑就会卡
不过这应该是硬盘问题吧
这应该就是内存问题,猛跑是必须的啊,不然玩gta有何意义
反正现在我在买根4g试试看8g会不会好点
8g有个别人说还是会卡,只不过玩比较就才会。不过大部分人都说
到时试试就知道了。听别人说没有
不管了,我也决定加了.200快而已
妈的第一次为玩游戏加配置
妈的我的内存条发中通在一个地方卡了一天,不想说了。
。。。。呃
我的内存装上了
提高不是一点点啊
建议你也入手吧
本回答被网友采纳
我不觉得卡,我就是4G内存的,我新买的主机还没到,然后就先用家里的一体机玩的,你可以自己上网查查联想C540一体机的配置!我现在800*600 30帧上!
800*600。。。。。这画面你居然能
还行,反正新主机一到,4K杠杠的
手柄玩。。你居然能忍
大哥。。。是PC主机。。。
好像是这样,开始进入很流畅,越玩越卡
所以说我在买内存条
最小画面效果
最好8g,这游戏,硬件杀手
其他2条回答
为您推荐:
其他类似问题
4g内存的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。玩游戏卡加内存条有用吗_百度知道
玩游戏卡加内存条有用吗
配置如图,玩GTA5画质各方面都调到最低了。进入新的地方卡顿现象严重,加内存条是否能起作用。求解?
我有更好的答案
这么和你说吧,我的处理器比你差一点点,显卡和你是一样的,唯一的区别就是我内存是8G,要不就是你没用独显工作,要么就加内存吧,绝对有改善,忘了说了,我运行GTA5,分辨率调到1360,纹理阴影普通,其他都高,稳定40+FPS,一点都不卡······已经通关········
采纳率:60%
加根同样的内存一定能起到点作用,不过如果弄个固态硬盘那提速就会明显了,你这到新的地方就是加载图的时候,这时图像数据传输量会很大,加根同样的内存或用固态硬盘都能起到改善作用。
为您推荐:
其他类似问题
您可能关注的内容
自然村的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。玩很大!张继科上厕所竟然被他自己全程直播
[摘要]因为是第一次参加直播综艺的录制,科科上厕所的时候完全没有想到要关麦这件事!然后……几百万在线观看《看你往哪跑》直播的小伙伴们,没有一点点防备地接收到了这一有声福利——哗啦啦哗啦啦。
正在加载...
腾讯娱乐讯 (文/一程江)话说谁都有那么点“见不得人”的小秘密,一旦见光就是死。不吹不黑,理智讨论,科的奥运抗压日记遭曝光,迷妹们会不会哭到天亮高喊心疼老公?如果的不打码出浴视频遭曝光,一票肉体饭会不会鼻血流尽而亡?如果的私人电话号码遭曝光,广大人民群众会不会排着队给甜馨打电话?如果的无下限表演课全记录遭曝光,粉丝们会不会感叹一句,怎么没早点开发出你这老司机属性,害得我们矜持那么久!真是巧了嘿!这些资料据说都被《看你往哪跑》节目组找齐了!为了保护自己的秘密不被曝光,四位男神必须要在指定时间内,在城市中完成对节目组指定的三队达人队伍的追捕,此次追捕还是采用了全程直播的形式,直播过网友可以通过弹幕的形式向他们提供线索和帮助。于是乎,四位男神踏上守护秘密的征程,还纷纷献出了自己的宝贵第一次,害羞脸。万万没想到,这万众瞩目的第一期节目刚开始,nili科科就开始搞事情!话说科科为了搞出这个大新闻也是酝酿了好久。究竟是怎么回事呢?请听小编慢慢道来~刚从节目发布会现场出来,大家马上开启追捕行动的时候,张继科就拉着亮哥说,我想去个洗手间!还肥肠机智的向弹幕求助:给我个洗手间的位置↓不过为了追捕达人,张继科一直也没顾得上去解决“个人问题”。后来他和贾乃亮在执行任务的过程中来到了一家民居,此刻科科终于有时间解决一下“人生大事”了!然鹅,因为是第一次参加直播综艺的录制,科科上厕所的时候完全没有想到要关麦这件事!然后……几百万在线观看《看你往哪跑》直播的小们,没有一防备地接收到了这一有声福利——哗啦啦哗啦啦。相信你内心的弹幕也一定是这样的:“我老公上厕所的现场我来守护!”“请给我画面啊思密达!” 虽然没有画面,但是我们可以想象的空间却很足哇,听说节目的后期君相当给力的做了一些特效,直接引领我们脑补了那些不可描述的画面。有没有很期待?虽然被这么多人听到了自己的“小秘密”,张继科却淡定得很,还傲娇地“训斥”起了屏幕另一端的网友们:“我连上厕所你们也听啊,我干什么你们不听啊?”报告老公,你干什么我们都想听!在《看你往哪跑》中,张继科不仅连上厕所都直播了,还送上了绕口令处女秀。这题还是亮哥出的,话说,上大学那会每天都练嘴上功夫的亮哥出这题可有点欺负人哟!hin好,舌头捋不直我们也爱你!只要你愿意多说话!这样展现真性情的国民老公你们爱吗!你们想爱到老吗!贴心的亮哥已经帮你们说过好话啦!谈论理想型问题的时候,亮哥直接劝科科,“干脆你就别结婚了,这样粉丝们都想一直陪你到老!追随你,喜欢你,爱护你!”说到这句话的时候迷妹们是不是都想冲进屏幕给亮哥一个爱的么么哒,实在太贴心啊有木有!话说回来,从带着甜馨上节目的那天起,亮哥就一步一步地奠定了自己综艺界扛把子的地位。玩起直播来也是溜到飞起,不过参与全程直播类的综艺节目,亮哥也是第一次。而今天,老司机也是第一次栽了!节目开始前,随行导演问,“亮亮,昨天晚上休息的怎么样?”这时候亮哥的回答是,“非常好!因为在亮哥的世界里,从来没有疲惫这两个字。”啪啪啪!你听到那打脸的声音了吗!跑了大半天,又做了不知道多少个俯卧撑的亮哥终于知道累了吧?不仅如此,亮哥在颜值这个问题上也给自己插上了flag!先说自己是明星的颜值担当,然后,他变成了小浣熊↓不过有失也有得嘛,亮哥居然在乒乓球台前赢了张继科,一上午的疲惫瞬间被狂喜替代了啊!隔着屏幕都想喊话刘国梁指导了!另一边,第一次作为固定嘉宾出现在综艺节目中的孙杨和徐海乔,组成的海洋组合身高差萌萌哒~徐海乔虽然是头一回当固定嘉宾,也是一副轻车熟路的样子,马上就向吃瓜群众们求助啦!快告诉我们白队的方位哟!只不过,帅不过三秒这句话大概适用于每一个第一眼看上去闪闪发光的男神……因为接下来他就暴露了自己路痴的事实:所以交通银行在哪???Exo me?你问谁?谁知道?好吧,海宝们快来营救游戏黑洞吧!CP年年有,今年糖特多!两人这阵势根本就不像第一次合作嘛!还记得发布会现场孙杨和徐海乔那个爱的抱抱,转眼间刚上车的乔叔大就继续爱心满满。孙杨看着网友们不断调戏自己的弹幕,有点脸红害羞的说,“他们叫我脱衣服,说脱了就告诉我(线索)”。乔叔一听,这哪儿行啊!一瞬间男友力爆棚,搂过大白杨就来了一句,“不行,我得保护你!”还指着镜头“警告”迷妹们,不能那么污啊真的!不过我们是不会剧透游戏黑洞徐海乔最终变身通关大boss的,我们也不会剧透睡不醒藏獒张继科变成了个絮絮叨叨的话痨,我们更不会剧透大白杨化身大力水手对一辆车做了不可描述的事情。因为这一切的答案,都在今天晚上20:00腾讯视频《看你往哪跑》的第一期节目里哦~
正文已结束,您可以按alt+4进行评论
责任编辑:v_xueyyang
扫一扫,用手机看新闻!
用微信扫描还可以
分享至好友和朋友圈
娱乐最深度
最新娱乐资讯
Copyright & 1998 - 2018 Tencent. All Rights Reserved博客分类:
一、JVM内存模型及垃圾收集算法
1.根据Java虚拟机规范,JVM将内存划分为:
New(年轻代)
Tenured(年老代)
永久代(Perm)
其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。
年轻代(New):年轻代用来存放JVM刚分配的Java对象
年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。
New又分为几个部分:
Eden:Eden用来存放JVM刚分配的对象
Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
2.垃圾回收算法
垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:
Serial算法(单线程)
JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。
稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。
还有一个问题是,垃圾回收动作何时执行?
当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载
另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出
JVM98%的时间都花费在内存回收
每次回收的内存小于2%
满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印Heap Dump。
二、内存泄漏及解决方法
1.系统崩溃前的一些现象:
每次垃圾回收的时间越来越长,由之前的10ms延长到50ms左右,FullGC的时间也有之前的0.5s延长到4、5s
FullGC的次数越来越多,最频繁时隔不到1分钟就进行一次FullGC
年老代的内存越来越大并且每次FullGC后年老代没有内存被释放
之后系统会无法响应新的请求,逐渐到达OutOfMemoryError的临界值。
2.生成堆的dump文件
通过JMX的MBean生成当前的Heap信息,大小为一个3G(整个堆的大小)的hprof文件,如果没有启动JMX可以通过Java的jmap命令来生成该文件。
3.分析dump文件
下面要考虑的是如何打开这个3G的堆信息文件,显然一般的Window系统没有这么大的内存,必须借助高配置的Linux。当然我们可以借助X-Window把Linux上的图形导入到Window。我们考虑用下面几种工具打开该文件:
IBM HeapAnalyzer
JDK 自带的Hprof工具
使用这些工具时为了确保加载速度,建议设置最大内存为6G。使用后发现,这些工具都无法直观地观察到内存泄漏,Visual VM虽能观察到对象大小,但看不到调用堆栈;HeapAnalyzer虽然能看到调用堆栈,却无法正确打开一个3G的文件。因此,我们又选用了Eclipse专门的静态内存分析工具:Mat。
4.分析内存泄漏
通过Mat我们能清楚地看到,哪些对象被怀疑为内存泄漏,哪些对象占的空间最大及对象的调用关系。针对本案,在ThreadLocal中有很多的JbpmContext实例,经过调查是JBPM的Context没有关闭所致。
另,通过Mat或JMX我们还可以分析线程状态,可以观察到线程被阻塞在哪个对象上,从而判断系统的瓶颈。
5.回归问题
Q:为什么崩溃前垃圾回收的时间越来越长?
A:根据内存模型和垃圾回收算法,垃圾回收分两部分:内存标记、清除(复制),标记部分只要内存大小固定时间是不变的,变的是复制部分,因为每次垃圾回收都有一些回收不掉的内存,所以增加了复制量,导致时间延长。所以,垃圾回收的时间也可以作为判断内存泄漏的依据
Q:为什么Full GC的次数越来越多?
A:因此内存的积累,逐渐耗尽了年老代的内存,导致新对象分配没有更多的空间,从而导致频繁的垃圾回收
Q:为什么年老代占用的内存越来越大?
A:因为年轻代的内存无法被回收,越来越多地被Copy到年老代
三、性能调优
除了上述内存泄漏外,我们还发现CPU长期不足3%,系统吞吐量不够,针对8core×16G、64bit的Linux服务器来说,是严重的资源浪费。
在CPU负载不足的同时,偶尔会有用户反映请求的时间过长,我们意识到必须对程序及JVM进行调优。从以下几个方面进行:
线程池:解决用户响应时间长的问题
JVM启动参数:调整各代的内存比例和垃圾回收算法,提高吞吐量
程序算法:改进程序逻辑算法提高性能
1.Java线程池(java.util.concurrent.ThreadPoolExecutor)
大多数JVM6上的应用采用的线程池都是JDK自带的线程池,之所以把成熟的Java线程池进行罗嗦说明,是因为该线程池的行为与我们想象的有点出入。Java线程池有几个重要的配置参数:
corePoolSize:核心线程数(最新线程数)
maximumPoolSize:最大线程数,超过这个数量的任务会被拒绝,用户可以通过RejectedExecutionHandler接口自定义处理方式
keepAliveTime:线程保持活动的时间
workQueue:工作队列,存放执行的任务
Java线程池需要传入一个Queue参数(workQueue)用来存放执行的任务,而对Queue的不同选择,线程池有完全不同的行为:
一个无容量的等待队列,一个线程的insert操作必须等待另一线程的remove操作,采用这个Queue线程池将会为每个任务分配一个新线程
: 无界队列,采用该Queue,线程池将忽略 maximumPoolSize参数,仅用corePoolSize的线程处理所有的任务,未处理的任务便在LinkedBlockingQueue中排队
有界队列,在有界队列和 maximumPoolSize的作用下,程序将很难被调优:更大的Queue和小的maximumPoolSize将导致CPU的低负载;小的Queue和大的池,Queue就没起动应有的作用。
其实我们的要求很简单,希望线程池能跟连接池一样,能设置最小线程数、最大线程数,当最小数&任务&最大数时,应该分配新的线程处理;当任务&最大数时,应该等待有空闲线程再处理该任务。
但线程池的设计思路是,任务应该放到Queue中,当Queue放不下时再考虑用新线程处理,如果Queue满且无法派生新线程,就拒绝该任务。设计导致“先放等执行”、“放不下再执行”、“拒绝不等待”。所以,根据不同的Queue参数,要提高吞吐量不能一味地增大maximumPoolSize。
当然,要达到我们的目标,必须对线程池进行一定的封装,幸运的是ThreadPoolExecutor中留了足够的自定义接口以帮助我们达到目标。我们封装的方式是:
以SynchronousQueue作为参数,使maximumPoolSize发挥作用,以防止线程被无限制的分配,同时可以通过提高maximumPoolSize来提高系统吞吐量
自定义一个RejectedExecutionHandler,当线程数超过maximumPoolSize时进行处理,处理方式为隔一段时间检查线程池是否可以执行新Task,如果可以把拒绝的Task重新放入到线程池,检查的时间依赖keepAliveTime的大小。
2.连接池(org.apache.commons.dbcp.BasicDataSource)
在使用org.apache.commons.dbcp.BasicDataSource的时候,因为之前采用了默认配置,所以当访问量大时,通过JMX观察到很多Tomcat线程都阻塞在BasicDataSource使用的Apache ObjectPool的锁上,直接原因当时是因为BasicDataSource连接池的最大连接数设置的太小,默认的BasicDataSource配置,仅使用8个最大连接。
我还观察到一个问题,当较长的时间不访问系统,比如2天,DB上的Mysql会断掉所以的连接,导致连接池中缓存的连接不能用。为了解决这些问题,我们充分研究了BasicDataSource,发现了一些优化的点:
Mysql默认支持100个链接,所以每个连接池的配置要根据集群中的机器数进行,如有2台服务器,可每个设置为60
initialSize:参数是一直打开的连接数
minEvictableIdleTimeMillis:该参数设置每个连接的空闲时间,超过这个时间连接将被关闭
timeBetweenEvictionRunsMillis:后台线程的运行周期,用来检测过期连接
maxActive:最大能分配的连接数
maxIdle:最大空闲数,当连接使用完毕后发现连接数大于maxIdle,连接将被直接关闭。只有initialSize & x & maxIdle的连接将被定期检测是否超期。这个参数主要用来在峰值访问时提高吞吐量。
initialSize是如何保持的?经过研究代码发现,BasicDataSource会关闭所有超期的连接,然后再打开initialSize数量的连接,这个特性与minEvictableIdleTimeMillis、timeBetweenEvictionRunsMillis一起保证了所有超期的initialSize连接都会被重新连接,从而避免了Mysql长时间无动作会断掉连接的问题。
在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置,默认情况不做任何设置JVM会工作的很好,但对一些配置很好的Server和具体的应用必须仔细调优才能获得最佳性能。通过设置我们希望达到一些目标:
GC的时间足够的小
GC的次数足够的少
发生Full GC的周期足够的长
前两个目前是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取其平衡。
(1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值
(2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小
(3)年轻代和年老代设置多大才算合理?这个我问题毫无疑问是没有答案的,否则也就不会有调优。我们观察一下二者大小变化有哪些影响
更大的年轻代必然导致更小的年老代,大的年轻代会延长普通GC的周期,但会增加每次GC的时间;小的年老代会导致更频繁的Full GC
更小的年轻代必然导致更大年老代,小的年轻代会导致普通GC很频繁,但每次的GC时间会更短;大的年老代会减少Full GC的频率
如何选择应该依赖应用程序对象生命周期的分布情况:如果应用存在大量的临时对象,应该选择更大的年轻代;如果存在相对较多的持久对象,年老代应该适当增大。但很多应用都没有这样明显的特性,在抉择时应该根据以下两点:(A)本着Full GC尽量少的原则,让年老代尽量缓存常用对象,JVM的默认比例1:2也是这个道理 (B)通过观察应用一段时间,看其他在峰值时年老代会占多少内存,在不影响Full GC的前提下,根据实际情况加大年轻代,比如可以把比例控制在1:1。但应该给年老代至少预留1/3的增长空间
(4)在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法: -XX:+UseParallelOldGC ,默认为Serial收集
(5)线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。
(4)可以通过下面的参数打Heap Dump信息
-XX:HeapDumpPath
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:/usr/aaa/dump/heap_trace.txt
通过下面参数可以控制OutOfMemoryError时打印堆的信息
-XX:+HeapDumpOnOutOfMemoryError
请看一下一个时间的Java参数配置:(服务器:Linux 64Bit,8Core×16G)
JAVA_OPTS="$JAVA_OPTS -server -Xms3G -Xmx3G -Xss256k -XX:PermSize=128m -XX:MaxPermSize=128m -XX:+UseParallelOldGC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/aaa/dump -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/usr/aaa/dump/heap_trace.txt -XX:NewSize=1G -XX:MaxNewSize=1G"
经过观察该配置非常稳定,每次普通GC的时间在10ms左右,Full GC基本不发生,或隔很长很长的时间才发生一次
通过分析dump文件可以发现,每个1小时都会发生一次Full GC,经过多方求证,只要在JVM中开启了JMX服务,JMX将会1小时执行一次Full GC以清除引用,关于这点请参考附件文档。
4.程序算法调优:本次不作为重点
参考资料:
http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html
来源:http://blog.csdn.net/chen77716/article/details/5695893
=======================================================================================
一切都是为了这一步,调优,在调优之前,我们需要记住下面的原则:
1、多数的Java应用不需要在服务器上进行GC优化;
2、多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;
3、在应用上线之前,先考虑将机器的JVM参数设置到最优(最适合);
4、减少创建对象的数量;
5、减少使用全局变量和大对象;
6、GC优化是到最后不得已才采用的手段;
7、在实际使用中,分析GC情况优化代码比优化GC参数要多得多;
GC优化的目的有两个(http://www.360doc.com/content/13/43_.shtml):
1、将转移到老年代的对象数量降低到最小;
2、减少full GC的执行时间;
为了达到上面的目的,一般地,你需要做的事情有:
1、减少使用全局变量和大对象;
2、调整新生代的大小到最合适;
3、设置老年代的大小为最合适;
4、选择合适的GC收集器;
在上面的4条方法中,用了几个“合适”,那究竟什么才算合适,一般的,请参考上面“收集器搭配”和“启动内存分配”两节中的建议。但这些建议不是万能的,需要根据您的机器和应用情况进行发展和变化,实际操作中,可以将两台机器分别设置成不同的GC参数,并且进行对比,选用那些确实提高了性能或减少了GC时间的参数。
真正熟练的使用GC调优,是建立在多次进行GC监控和调优的实战经验上的,进行监控和调优的一般步骤为:
1,监控GC的状态
使用各种JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和gc日志,根据实际的各区域内存划分和GC执行时间,觉得是否进行优化;
2,分析结果,判断是否需要优化
如果各项参数设置合理,系统没有超时日志出现,GC频率不高,GC耗时不高,那么没有必要进行GC优化;如果GC时间超过1-3秒,或者频繁GC,则必须优化;
注:如果满足下面的指标,则一般不需要进行GC:
Minor GC执行时间不到50ms;
Minor GC执行不频繁,约10秒一次;
Full GC执行时间不到1s;
Full GC执行频率不算频繁,不低于10分钟1次;
3,调整GC类型和内存分配
如果内存分配过大或过小,或者采用的GC收集器比较慢,则应该优先调整这些参数,并且先找1台或几台机器进行beta,然后比较优化过的机器和没有优化的机器的性能对比,并有针对性的做出最后选择;
4,不断的分析和调整
通过不断的试验和试错,分析并找到最合适的参数
5,全面应用参数
如果找到了最合适的参数,则将这些参数应用到所有服务器,并进行后续跟踪。
上面的内容都是纸上谈兵,下面我们以一些真实例子来进行说明:
笔者昨日发现部分开发测试机器出现异常:java.lang.OutOfMemoryError: GC overhead limit exceeded,这个异常代表:
GC为了释放很小的空间却耗费了太多的时间,其原因一般有两个:1,堆太小,2,有死循环或大对象;
笔者首先排除了第2个原因,因为这个应用同时是在线上运行的,如果有问题,早就挂了。所以怀疑是这台机器中堆设置太小;
使用ps -ef |grep "java"查看,发现:
该应用的堆区设置只有768m,而机器内存有2g,机器上只跑这一个java应用,没有其他需要占用内存的地方。另外,这个应用比较大,需要占用的内存也比较多;
笔者通过上面的情况判断,只需要改变堆中各区域的大小设置即可,于是改成下面的情况:
跟踪运行情况发现,相关异常没有再出现;
实例2:(http://www.360doc.com/content/13/43_.shtml)
一个服务系统,经常出现卡顿,分析原因,发现Full GC时间太长:
jstat -gcutil:
YGC YGCT FGC FGCT
12.16 0.00 5.18 63.78 20.32
分析上面的数据,发现Young GC执行了54次,耗时2.047秒,每次Young GC耗时37ms,在正常范围,而Full GC执行了5次,耗时6.946秒,每次平均1.389s,数据显示出来的问题是:Full GC耗时较长,分析该系统的是指发现,NewRatio=9,也就是说,新生代和老生代大小之比为1:9,这就是问题的原因:
1,新生代太小,导致对象提前进入老年代,触发老年代发生Full GC;
2,老年代较大,进行Full GC时耗时较大;
优化的方法是调整NewRatio的值,调整到4,发现Full GC没有再发生,只有Young GC在执行。这就是把对象控制在新生代就清理掉,没有进入老年代(这种做法对一些应用是很有用的,但并不是对所有应用都要这么做)
一应用在性能测试过程中,发现内存占用率很高,Full GC频繁,使用sudo -u admin -H
jmap -dump:format=b,file=文件名.hprof pid 来dump内存,生成dump文件,并使用Eclipse下的mat差距进行分析,发现:
从图中可以看出,这个线程存在问题,队列LinkedBlockingQueue所引用的大量对象并未释放,导致整个线程占用内存高达378m,此时通知开发人员进行代码优化,将相关对象释放掉即可。
浏览 63620
“显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。”虽然很多错误的解释,但是取其精华,去其糟粕吧。 两个Survivor的目的是为了完成复制内存的目的,为什么要复制内存呢?因为经过标记-清楚垃圾回收后,原有内存上会产生很多碎片(对象与对象之间不是连续的),碎片会导致下次分配内存的时候有问题(分配算法大概有2种,偏移量和记录已经被分配的内存),所以引申出一种标记-整理的算法,把经过回收后还存活的对象 复制到一个空Survivor上,这样就是连续的了~~你说的这个两个Suevivor区也不对吧。年轻带根本就没有标记清除算法,也不会产生内存碎片吧。学杂了吧,兄弟
浏览: 4213964 次
来自: 一片神奇的土地
可以用,感谢!
[color=red][/color]dfsdsd[color ...
dd发的发给好友
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 玩游戏内存不足怎么办 的文章

 

随机推荐