相关疑难解决方法(0)

MSIL和Java字节码之间的区别?

我是.Net的新手,我想先了解基础知识.MSIL和Java字节码有什么区别?

.net java cil bytecode

78
推荐指数
4
解决办法
2万
查看次数

什么时候有资格被CLR内联的方法?

我在应用程序中观察到了很多"堆栈内省"代码,这些代码通常隐含地依赖于它们的包含方法没有内联的正确性.这些方法通常涉及到:

  • MethodBase.GetCurrentMethod
  • Assembly.GetCallingAssembly
  • Assembly.GetExecutingAssembly

现在,我发现围绕这些方法的信息非常混乱.我听说运行时不会内联调用GetCurrentMethod的方法,但我找不到任何相关的文档.我曾多次在StackOverflow上看过帖子,比如这个帖子,表明CLR没有内联交叉汇编调用,但GetCallingAssembly 文档强烈指出不是这样.

还有备受诟病的人[MethodImpl(MethodImplOptions.NoInlining)],但我不确定CLR是否认为这是"请求"或"命令".

请注意,我要求从合同的角度来概述资格,而不是当前JITter的实施由于实施困难而拒绝考虑方法,或者JITter最终在评估交易后最终选择内联合格方法时权衡.我已经阅读了这个这个,但他们似乎更关注最后两点(有传递提到的MethodImpOptions.NoInlining和"异国情调的IL指令",但这些似乎是作为启发而不是义务呈现).

什么时候CLR 允许内联?

.net clr jit inlining

37
推荐指数
2
解决办法
4047
查看次数

GC是否将内存释放回操作系统?

当垃圾收集器运行并释放内存时,此内存会返回到操作系统,或者它是否作为进程的一部分保留.我的印象是,内存从未实际发布回操作系统,而是作为内存区/池的一部分保留,以便由同一进程重用.

结果,进程的实际内存永远不会减少.一篇提醒我的文章这篇文章和Java的Runtime是用C/C++编写的,所以我想同样的事情适用于此?

更新
我的问题是关于Java.我提到C/C++,因为我假设Java的分配/解除分配是由JRE使用某种形式的malloc/delete完成的

java garbage-collection memory-management

36
推荐指数
4
解决办法
2万
查看次数

为什么需要虚拟机?

我正在阅读这个问题,以找出Java虚拟机和.NET CLR之间的差异,Benji的回答让我想知道为什么虚拟机首先是必要的.

根据我对Benji的解释的理解,虚拟机的JIT编译器将中间代码解释为在CPU上运行的实际汇编代码.它必须这样做的原因是因为CPU通常具有不同数量的寄存器,并且根据Benji的说法,"一些寄存器是特殊用途的,并且每个指令都要求其操作数在不同的寄存器中." 这是有道理的,因此需要像虚拟机这样的中间解释器,以便可以在任何CPU上运行相同的代码.

但是,如果是这种情况,那么我不明白为什么编译成机器代码的C或C++代码能够在任何计算机上运行,​​只要它是正确的操作系统.那么为什么我在使用Pentium的Windows机器上编译的C程序能够在我使用AMD的其他Windows机器上运行?

如果C代码可以在任何CPU上运行,那么虚拟机的目的是什么?是否可以在任何操作系统上运行相同的代码?我知道Java在几乎任何操作系统上都有VM版本但除了Windows之外还有其他操作系统的CLR吗?

或者还有其他我想念的东西?操作系统是否对其运行的汇编代码做了一些其他解释,以使其适应特定的CPU或其他东西?

我很好奇这一切是如何运作的,所以我们将非常感谢一个明确的解释.

注意:我之所以不在JVM与CLR问题中发表我的查询作为评论的原因是因为我没有足够的积分发表评论但= b.

编辑:感谢所有的好答案!所以我似乎缺少的是,虽然所有处理器都有差异,但是有一个共同的标准化,主要是X86架构,它提供了足够大的通用功能集,因此在一个X86处理器上编译的C代码将在大多数情况下工作在另一个X86处理器上.这进一步推动了虚拟机的正当性,更不用说我忘记了垃圾收集的重要性.

compiler-construction vm-implementation

26
推荐指数
4
解决办法
3949
查看次数

更高级的类型 - 为什么Scala而不是F#?

鉴于CLR泛型实现支持比JVM更多的功能,例如具体化,而JVM的泛型仅仅是Java "编译器技巧",为什么在F#中不可能使用更高级的类型但在Scala中可能?CLR泛型实现是否会以某种方式阻碍事物的发生,而JVM缺少一个允许您进一步超出设计者的意图; 有点像动态语言让你做一个强类型编译器不可能的技巧?

f# scala typeclass higher-kinded-types

24
推荐指数
1
解决办法
2550
查看次数

Java 6过多的内存使用

Java 6是否比大预期的应用程序消耗更多的内存?

我有一个我已经开发多年的应用程序,直到现在我的特定测试配置大约需要30-40 MB; 现在使用Java 6u10和11,它在活动时需要几百个.它反弹很多,在50M到200M之间的任何地方,当它空转时,它会执行 GC并将内存放下.此外,它还会产生数百万的页面错误.所有这些都是通过Windows任务管理器观察到的.

因此,我在我的探查器(jProfiler)下运行它并使用jVisualVM,它们都指示通常适度的堆和大约30M的用户使用,即使完全处于我的负载测试周期.

所以我很神秘!它不只是从Windows虚拟内存池中请求更多内存 - 这显示为200M"内存使用".

澄清:我希望对此非常清楚 - 使用Java VisualVM在18小时内观察到类堆和perm gen堆已经完全稳定.分配的易失性堆(eden和tenured)不动以16MB(它在最初的几分钟内到达),并且这个内存的使用波动在一个完美的模式,从8MB到16MB均匀增长,此时GC启动将它降回8MB.在这18小时的时间内,系统在进行压力测试后处于恒定的最大负载下.在许多运行中都可以看到这种行为完美一致的可重复性.唯一的异常现象是,虽然这是通过任务管理器观察到的从Windows获取的内存,但从64MB到900 + MB的所有地方都会出现波动.

更新2008-12-18:我用-Xms16M -Xmx16M运行程序没有任何明显的不利影响 - 性能很好,总运行时间大致相同.但是短时间内的内存使用量仍然达到了180M左右.

更新2009-01-21:似乎答案可能是线程数 - 请参阅下面的答案.


编辑:我的意思是数百万页错误 - 在30M +区域.

编辑:我有一台4G机器,所以200M在这方面并不重要.

java memory-management

22
推荐指数
4
解决办法
6991
查看次数