VM运行的太慢,麻烦家族高手看看.

帖子很冷清,卤煮很失落!求安慰
手机签到经验翻倍!快来扫一扫!
高手来看看我的M2A-VM是什么问题啊?
1239浏览 / 8回复
我前天刚拿的新板,AMD3600+双核(90工艺)的,1G,加上,显存设过128和256M,玩""里有时画面会卡一下,注意:(问题就在这,一般的时候,卡一下后就是顿一会而已,然后就会过去了),可是我的屏幕就会假死,点什么也不能动,可是里人物是可以动的,机器也没有死,切换出来一切正常,就是不能正常游戏,只能强退游戏了,有高手知道这是怎么回事吗?
驅動裝得有沒有問題?BIOS刷了沒?是不是散熱問題?
呵呵,要打双核补丁的,然后在看看这个游戏的最底配置是什么~~~
对&第2楼&xiaoxia765&说:=========================多谢,基本上算是解决了吧,我到AMD的网上下载了最新的双核补丁和ATI1250的最新驱动(装完显示是X1200的,不解),昨天一晚上没有屏幕假死.
对&第3楼&逍遙の死神&说:=========================这块主板显示核心频率可以调整吗?超频性能怎样?
显示X1200的话,应该是主板BIOS版本太低了,刷新试一下吧~~
晕.我的安装了双核补丁,又更新了1250显卡驱动,玩奇迹世界还是屏幕假死!哪位高手有更好解决办法?
那不是假死,那是正常,换了一个地图或刚上线都那样,他在和网络供应商获取资料,过一会就好了。有时候玩的时候 可以说话 但是点不了人物,那是游戏本身的问题,赶紧小退,要不过一个必掉线
对&楼主&逍遙の死神&说:=========================最好的办法,就是另装一块比较好的独显!!!!!!!!
您需要登录后才可以回帖&&&|&&&&&
可能感兴趣的板块:
用户名/注册邮箱/注册手机号
其他第三方号登录在vm虚拟机上运行靠谱助手很慢!求救!! _ 有问必答 - 靠谱社区
后使用快捷导航
没有帐号?
查看: 1559|回复: 0
在vm虚拟机上运行靠谱助手很慢!求救!! 我把靠谱助手安装在vm虚拟机了,安装都可以成功,运行也可以,就是比在PC端安装使用慢了不知道多倍,太慢了,没法玩!谁有办法解决这个问题吗?
安装靠谱福利宝
领取更多靠谱积分
兑换游戏代金券如何查看 HotSpot VM 的运行时数据 - 文章 - 伯乐在线
& 如何查看 HotSpot VM 的运行时数据
本文将借助 HSDB 工具分析 HotSpot VM 的运行时数据,运行的 Java 环境为 JDK 1.8。
class Test {
static String version = "1.0";
Test(String name, int id) {
this.name =
static void fn() {}
void fn2(){}
public class Main {
static Test t1 = new Test("java", 1);
private Test t2 = new Test("java", 2);
public void fn() {
Test t3 = new Test("java", 3);
public static void main(String[] args) {
new Main().fn();
123456789101112131415161718192021222324
class Test {&&&&static String version = "1.0";&&&&String name;&&&&int id;&&&&Test(String name, int id) {&&&&&&&&this.name = name;&&&&&&&&this.id = id;&&&&}&&&&static void fn() {}&&&&void fn2(){}}&public class Main {&&&&static Test t1 = new Test("java", 1);&&&&private Test t2 = new Test("java", 2);&&&&&public void fn() {&&&&&&&&Test t3 = new Test("java", 3);&&&&}&&&&&public static void main(String[] args) {&&&&&&&&new Main().fn();&&&&}}
运行上述代码,会在Java堆中生成3个Test对象,变量t1,t2,t3分别存储在方法区、实例字段和局部变量表中,那么Test对象的内存是如何布局的呢?
在查看运行时数据之前,需要让程序刚好执行完new Main().fn();并暂停,平时可能习惯了在Eclipse、IntelliJ IDEA、NetBeans等Java IDE里使用Java层调试器,但为了减少对外部工具的依赖,本文将使用Oracle JDK自带的jdb工具来完成此任务。
jdb使用步骤如下:
1、jdb -XX:+UseSerialGC -Xmx10m命令启动jdb;
2、stop in Main.fn命令指定在方法入口设置断点;
3、run Main命令指令主类,启动java程序;
4、next命令可以向前执行一步;
采用jps命令查看目前调试java程序的PID
采用命令java -cp sa-jdi.jar sun.jvm.hotspot.HSDB启动HSDB工具,并连接到目标进程上,注意:Windows上Oracle JDK7才可以用HSDB。
连接上之后
默认窗口是Java Threads,显示当前进程的线程列表,双击线程打开一个Oop Inspector窗口,显示该线程在HotSpot VM的对象。
在菜单里选择Windows -& Console,打开HSDB里的控制台,用命令查看更多信息。
1、命令universe查看GC堆的大小、地址范围和使用情况;
hsdb& universe
Heap Parameters:
eden [0x0a0,0xb0000) space capacity = .884 used
from [0xb00,0x0000) space capacity = .0 used
[0x0,0x0000) space capacity = .0 usedInvocations: 0
[0x0,0x0000) space capacity = .0 usedInvocations: 0
hsdb& universeHeap Parameters:Gen 0:&& eden [0x0000,0xd50a0,0xb0000) space capacity = 2818048, 30.884 used&&from [0xb0000,0xb0000,0x0000) space capacity = 327680, 0.0 used&&to&& [0x0000,0x0000,0x0000) space capacity = 327680, 0.0 usedInvocations: 0&Gen 1:&& old&&[0x0000,0x0000,0x0000) space capacity = 7012352, 0.0 usedInvocations: 0
可以发现HotSpot在1.8的Java堆中,已经去除了Perm gen区,由youyoung gen和old gen组成。
2、命令scanoops查看指定类型的实例对象,接受两个必选参数和一个可选参数:必选参数是要扫描的地址范围,一个是起始地址一个是结束地址;可选参数用于指定要扫描什么类型的实例对象;
hsdb& scanoops 0x0 Test
0xcaf08 Test
0xcaf40 Test
0xcaf58 Test
hsdb& scanoops 0x0000 0x0000 Test0xcaf08 Test0xcaf40 Test0xcaf58 Test
通过执行结果可以看出,Java堆上的确有3个Test实例对象,对象的开始地址分别为0xcaf08、0xcaf40和0xcaf58。
3、命令whatis可以查看指定内存地址所在的区域;
hsdb& whatis 0xcaf08
Address 0xcaf08: In thread-local allocation buffer for thread "main" (1)
[0xc00000ff6caf70,0xd0a0})
hsdb& whatis 0xcaf40
Address 0xcaf40: In thread-local allocation buffer for thread "main" (1)
[0xc00000ff6caf70,0xd0a0})
hsdb& whatis 0xcaf58
Address 0xcaf58: In thread-local allocation buffer for thread "main" (1)
[0xc00000ff6caf70,0xd0a0})
1234567891011
hsdb& whatis 0xcaf08Address 0xcaf08: In thread-local allocation buffer for thread "main" (1)&&[0xc7448,0xcaf70,0xd5090,{0xd50a0})&hsdb& whatis 0xcaf40Address 0xcaf40: In thread-local allocation buffer for thread "main" (1)&&[0xc7448,0xcaf70,0xd5090,{0xd50a0})&hsdb& whatis 0xcaf58Address 0xcaf58: In thread-local allocation buffer for thread "main" (1)&&[0xc7448,0xcaf70,0xd5090,{0xd50a0})
上述结果可以发现3个Test实例对象都在分配给main线程的thread-local allocation buffer (TLAB)中。
4、命令inspect可以查看对象的内容;
hsdb& inspect 0xcaf08
instance of Oop for Test @ 0xcaf08 @ 0xcaf08 (size = 24)
_metadata._compressed_klass: InstanceKlass for Test
name: "java" @ 0x44a8 Oop for java/lang/String @ 0x44a8
hsdb& inspect 0xcaf08instance of Oop for Test @ 0xcaf08 @ 0xcaf08 (size = 24) _mark: 1_metadata._compressed_klass: InstanceKlass for Testname: "java" @ 0x44a8 Oop for java/lang/String @ 0x44a8id: 1
instance of Oop for Test:表明该地址代表的对象是Test类的实例
_mark:对象头的第一个字段,记录该对象的状态
_metadata._compressed_klass:指向描述Test类信息的对象
name:实例的字段
id:实例的对象
可以发现_metadata._compressed_klass并没有显示内存地址,是因为该对象在java8中并非在堆中进行分配。
5、命令mem可以看更直接的数据,接受的两个参数,起始地址和以字宽为单位的“长度”;
hsdb& mem 0xcaf08 4
0xcaf08: 0x0001
0xcaf10: 0xc10228
//_metadata._compressed_klass
0xcaf18: 0x44a8
0xcaf20: 0x0001
hsdb& mem 0xcaf08 40xcaf08: 0x0001&&//_mark0xcaf10: 0xc10228&&//_metadata._compressed_klass0xcaf18: 0x44a8&&//name0xcaf20: 0x0001&&//id
可以发现_metadata._compressed_klass所指向的地址0xc10228已经超出了Java堆的最大地址,所以通过执行inspect 0xc10228并不会返回对象内容。
不过_metadata._compressed_klass的内容,可以通过在Inspector窗口中输入Test实例对象的开始地址进行查看。
InstanceKlass是类的描述对象,存储着Java类型名称、继承关系、接口、字段信息、方法信息、虚方法表和接口方法表等数据,不过InstanceKlass是给VM内部使用的,并不直接暴露给用户;
InstanceKlass中维护了一个字段_java_mirror,指向类的Class对象,所以当使用obj.getClass()获取Class对象时,是通过obj -& _klass -& _java_mirror的过程进行获取的;
在jdk7之前,HotSpot把类的静态字段保存在InstanceKlass中;从jdk7开始,为了配合perm gem的移除工作,静态字段被移动到Class对象中,如Test类中的version变量,存放在_java_mirror所指向的Class对象中。
6、命令revptrs可以找出反向指针(如果变量a指向对象b,那么可以从b对象出发找到变量a);
查看第一个Test实例
hsdb& revptrs 0xcaf08
Computing reverse pointers...
Oop for java/lang/Class @ 0xc9928
hsdb& revptrs 0xcaf08Computing reverse pointers...Done.nullOop for java/lang/Class @ 0xc9928
这个变量在Class对象中,其实是Main类的Class对象,所以该变量为t1;
通过whatis命令查看该Class对象的分配位置
hsdb& whatis 0xc9928
Address 0xc9928: In thread-local allocation buffer for thread "main" (1)
[0xc00000ff6caf70,0xd0a0})
hsdb& whatis 0xc9928Address 0xc9928: In thread-local allocation buffer for thread "main" (1)&&[0xc7448,0xcaf70,0xd5090,{0xd50a0})
这个Class对象也是在eden里,具体来说在main线程的TLAB中,这个Class对象如何引用到Test类的实例?
通过inspect命令查看Class对象的内容
hsdb& inspect 0xc9928
instance of Oop for java/lang/Class @ 0xc9928 @ 0xc9928 (size = 104)
t1: Oop for Test @ 0xcaf08 Oop for Test @ 0xcaf08
hsdb& inspect 0xc9928instance of Oop for java/lang/Class @ 0xc9928 @ 0xc9928 (size = 104)&: t1: Oop for Test @ 0xcaf08 Oop for Test @ 0xcaf08
可以发现Main类的Class对象中存储了字段t1指向Test类的实例,该实例的起始地址正好是0xcaf08。
JVM规范中并没明确规定静态变量的存放位置,通常应该放在“方法区”中,不过在jdk7的HtoSpot实现中,静态变量被保存在了Java堆中;
前面也提到过,在JDK7之前的HotSpot实现中,静态变量被保存在InstanceKlass里,并放在PermGen中;
查看下一个Test实例
hsdb& revptrs 0xcaf40
Computing reverse pointers...
Oop for Main @ 0xcaf30
hsdb& revptrs 0xcaf40 Computing reverse pointers...Done.Oop for Main @ 0xcaf30
这个变量在Main类一个实例中,为t2;
通过inspect命令查看Main实例的内容
hsdb& inspect 0xcaf30
instance of Oop for Main @ 0xcaf30 @ 0xcaf30 (size = 16)
_metadata._compressed_klass: InstanceKlass for Main
t2: Oop for Test @ 0xcaf40 Oop for Test @ 0xcaf40
hsdb& inspect 0xcaf30instance of Oop for Main @ 0xcaf30 @ 0xcaf30 (size = 16)&: _mark: 1_metadata._compressed_klass: InstanceKlass for Maint2: Oop for Test @ 0xcaf40 Oop for Test @ 0xcaf40
在该实例中,的确存在字段t2指向起始地址为0xcaf40的Test实例。
查看最后一个Test实例
revptrs 0xcaf58
Computing reverse pointers...
revptrs 0xcaf58 Computing reverse pointers...Done.null
结果null,说明没有找到…
排除了前面两个Test实例,说明这个实例对应的变量应该为t3,该变量t3被保存在Main.fn方法调用栈中。
选择main线程,并点击图示的按钮,打开Stack Memory窗口如下:
Stack Memory窗口中,包含Main.fn()和Main.main()方法调用对应的栈帧,其中红色框框中对应Main.fn()的栈帧
第1列为内存地址,该地址指虚拟内存意义上的地址,而非物理地址;
第2列为该地址上的数据,以字宽为单位;
第3列是对数据的注释;
先看看栈帧的结构,一个栈帧从上到下,分别包含了操作数栈、栈帧信息和局部变量表。
通过inspect查看局部变量表数据,局部变量表第0位置slot[0] = “this”,指向 Main实例
hsdb& inspect 0xcaf30
instance of Oop for Main @ 0xcaf30 @ 0xcaf30 (size = 16)
_metadata._compressed_klass: InstanceKlass for Main
t2: Oop for Test @ 0xcaf40 Oop for Test @ 0xcaf40
hsdb& inspect 0xcaf30instance of Oop for Main @ 0xcaf30 @ 0xcaf30 (size = 16)_mark: 1_metadata._compressed_klass: InstanceKlass for Maint2: Oop for Test @ 0xcaf40 Oop for Test @ 0xcaf40
局部变量表第1位置slot[1] = +,指向Test实例,该实例正好是最后一个Test实例
hsdb& inspect 0xcaf58
instance of Oop for Test @ 0xcaf58 @ 0xcaf58 (size = 24)
_metadata._compressed_klass: InstanceKlass for Test
name: "java" @ 0x44a8 Oop for java/lang/String @ 0x44a8
hsdb& inspect 0xcaf58instance of Oop for Test @ 0xcaf58 @ 0xcaf58 (size = 24)_mark: 1_metadata._compressed_klass: InstanceKlass for Testname: "java" @ 0x44a8 Oop for java/lang/String @ 0x44a8id: 3
打赏支持我写出更多好文章,谢谢!
打赏支持我写出更多好文章,谢谢!
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线}

我要回帖

更多关于 别找我麻烦 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信