现在最火的古装游戏(占内存少)什么为什么这么火?

使用堆外内存 | 四火的唠叨
使用堆外内存
有时候对内存进行大对象的读写,会引起JVM长时间的停顿,有时候则是希望最大程度地提高JVM的效率,我们需要自己来管理内存(看起来很像是Java像C++祖宗的妥协吧)。据我所知,很多缓存框架都会使用它,比如我以前使用过的EhCache(给它包装了个酷一点的名字,叫BigMemory),以及现在项目中的Memcached。在nio以前,是没有光明正大的做法的,有一个work around的办法是直接访问Unsafe类。如果你使用Eclipse,默认是不允许访问sun.misc下面的类的,你需要稍微修改一下,给Type Access Rules里面添加一条所有类都可以访问的规则:
在使用Unsafe类的时候:
Unsafe f = Unsafe.getUnsafe();
发现还是被拒绝了,抛出异常:
java.lang.SecurityException: Unsafe
正如Unsafe的类注释中写道:
Although the class and all methods are public, use of this class is limited because only trusted code can obtain instances of it.
于是,只能无耻地使用反射来做这件事;
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe us = (Unsafe) f.get(null);
long id = us.allocateMemory(1000);
其中,allocateMemory返回一个指针,并且其中的数据是未初始化的。如果要释放这部分内存的话,需要调用freeMemory或者reallocateMemory方法。Unsafe对象提供了一系列put/get方法,例如putByte,但是只能一个一个byte地put,我不知道这样会不会影响效率,为什么不提供一个putByteArray的方法呢?
从nio时代开始,可以使用ByteBuffer等类来操纵堆外内存了:
ByteBuffer buffer = ByteBuffer.allocateDirect(numBytes);
像Memcached等等很多缓存框架都会使用堆外内存,以提高效率,反复读写,去除它的GC的影响。可以通过指定JVM参数来确定堆外内存大小限制(有的VM默认是无限的,比如JRocket,JVM默认是64M):
-XX:MaxDirectMemorySize=512m
对于这种direct buffer内存不够的时候会抛出错误:
java.lang.OutOfMemoryError: Direct buffer memory
千万要注意的是,如果你要使用direct buffer,一定不要加上DisableExplicitGC这个参数,因为这个参数会把你的System.gc()视作空语句,最后很容易导致OOM。
对于heap的OOM我们可以通过执行jmap -heap来获取堆内内存情况,例如以下输出取自我上周定位的一个问题:
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize
(2048.0MB)
MaxNewSize
SurvivorRatio
MaxPermSize
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = .8125MB)
39.59% used
Eden Space:
capacity = .625MB)
43.83% used
From Space:
capacity = .1875MB)
10.118% used
capacity = .1875MB)
= 0 (0.0MB)
= .1875MB)
concurrent mark-sweep generation:
capacity =
(2016.0MB)
(191406MB)
25.216% used
Perm Generation:
capacity = .MB)
60.604% used
可见堆内存都是正常的,重新回到业务日志里寻找异常,发现出现在堆外内存的分配上:
java.lang.OutOfMemoryError
at sun.misc.Unsafe.allocateMemory(Native Method)
at java.nio.DirectByteBuffer.(DirectByteBuffer.java:101)
at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:288)
at com.schooner.MemCached.SchoonerSockIOPool$TCPSockIO.(Unknown Source)
对于这个参数分配过小的情况下造成OOM,不妨执行jmap -histo:live看看(也可以用JConsole之类的外部触发GC),因为它会强制一次full GC,如果堆外内存明显下降,很有可能就是堆外内存过大引起的OOM。
对于堆外内存的使用率,可以使用rednaxelafx做的一个工具来查看:。
BTW,如果在执行jmap命令时遇到:
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process
这个算是JDK的一个bug(),只要是依赖于SA(Serviceability Agent)的工具,比如jinfo/jstack/jmap都会存在这个问题,但是Oracle说了“won’t fix”……
Ubuntu 10.10 and newer has a new default security policy that affects Serviceability commands. This policy prevents a process from attaching to another process owned by the same UID if the target process is not a descendant of the attaching process.
不过它也是给了解决方案的,需要修改/etc/sysctl.d/10-ptrace.conf:
kernel.yama.ptrace_scope = 0
如果你的操作系统不是Ubuntu,可以升级一下JDK的版本试试,我在RedHat上遇到过这样的问题,升级JDK版本以后解决了。
堆外内存泄露的问题定位通常比较麻烦,可以借助这个工具,它可以输出不同方法申请堆外内存的数量。当然,如果你是64位系统,你需要先安装。
最后,JDK存在一些direct buffer的bug(比如和),可能引发OOM,所以也不妨升级JDK的版本看能否解决问题。
文章未经特殊标明皆为本人原创,未经许可不得用于任何商业用途,转载请保持完整性并注明来源链接RAM和ROM是什么意思?手机内存和电脑内存的区别_最火下载站
您的位置: >
> RAM和ROM是什么意思?手机内存和电脑内存的区别
RAM和ROM是什么意思?手机内存和电脑内存的区别
  智能手机大家可以简单理解是指按照电脑的原理制作出来的手机,工作机理和电脑更为接近。和电脑一样,智能手机有自己的处理器,内存,硬盘等等设备,只不过由于厂商有意无意的误导,很多人对智能手机的&内存&认识可能出现了错误。下面幻儿就为大家简单介绍下手机内存与电脑内存的区别。买智能手机通常就会遇到几个重要参数,比如ROM、Ram、内存等。
  RAM和ROM是什么意思
  所谓ram实际上就是相当于电脑上的普通内存,和电脑内存是同样的工作,其可以当做电脑内存来理解。而rom就可以理解为电脑上的操作系统分区,只不过你不能随便改就是了。而通常厂家标称的&内存&则往往是指SD卡或者其他的存储空间,作用和电脑的硬盘一样。
  厂家之所以把外部存储空间当成为内存是按照&手机内存储空间&来定义的,实际上是一个比较容易让人混淆的概念。
  一般手机的内存包括rom和ram两部分,比如说手机4GB内存就有4GB外部存储空间、4GB的RAM,xram+yrom(x+y=4GB)等至少三种说法。所以千万不要简单的说手机内存是多少,一定要问清是多少ram多少rom,多大的存储空间。通常手机的rom是操作系统和软件安装的地方,rom太小就不能安装很多软件;ram是程序运行时的内存,如果ram太小就不能同时运行很多程序,或者有些程序直接跑不起来;而外部存储空间就是你放视频之类的地方,也是你手机连电脑后能看到的那个u盘,这个地方太小就放不了很多东西。
  随手写了点东西,希望以后不要再有人问我他手机内存是16GB为什么显示内存只有1GB之类的问题了。
上一篇: 下一篇:503: Service Unavailable
503: Service Unavailable
访问太频繁了,服务器要炸。当前位置 & &
& 内存价格暴涨坑惨八代酷睿!老古董火了
内存价格暴涨坑惨八代酷睿!老古董火了
07:01:49&&出处:&&作者:赵欢鑫
编辑:鲲鹏 &&)
让小伙伴们也看看:
阅读更多:
好文共享:
文章观点支持
文章价值打分
当前文章打分0 分,共有0人打分
[10-23][10-23][10-23][10-23][10-23][10-22][10-22][10-21][10-21][10-20]
登录驱动之家
没有帐号?
用合作网站帐户直接登录

我要回帖

更多关于 现在最火但内存不大的网游 的文章

 

随机推荐