很多时候遇到过一些群友问这样的问题:为什么Java有GC调优CLR没听说过有GC调优吗?是JavaJVMGC更强还是C#使用的.NETCLRGC更强?其实已经有几篇业界大佬的高赞文章分享给大家了,主要讨论JVM、CLR和GC调优。今天给大家分享一下大佬们的答案。R的回答https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB。..https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB。..https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB。..https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...https://www.wenjuan.com/s/UZB...首先给大家介绍一下R大学。R大学的名字叫RednaxelaFX,毕业于南京大学的巨头。他专注于高级编程语言虚拟机的设计和实现。对C#.NETCLR有非常深入的研究和理解。阿里、甲骨文、AzulSystem从事JVM虚拟机(HotSpotJVM和ZingJVM)的开发。现在在Databricks从事Spark开发。这里R主要给出CLR上几种调优方法的原因以及为什么CLR不需要xmx、xmn等参数,因为题主你没听过>_<假设题主讲的是以下三个层次oftuning优化的前两种情况:VM配置参数(如GC参数)的调优,应用本身代码的调优,以及VM本身实现的调优(2),不管是什么语言和环境不错,追求性能的人一定是在做。Java和.NET都有很好的分析器,可以帮助进行这方面的调查和调整。有时参数调优不够,只能更改自己的应用代码来解决问题。请看一个经典案例:在我们信任的托管代码中,我们最近与.NETGarbageCollector(3)的战斗,在CLR还没有开源的情况下,没有办法调整它。不过也有不少人贡献了补丁来提升Mono的性能,这也算是广义上的“.NET”VM实现层面的调优。CoreCLR开源后,很多人为CoreCLR贡献了各种补丁,包括“调优”。.NET编码人员过去经常被欺骗的事情之一是程序进入GC的时间到GC(time-to-GC),即从CLR说“我要开始做GC”到“真正开始做GC”。耗时。这里的主要开销来自请求所有应用程序线程挂起(SuspendEE),以及这些线程完成对请求的响应需要多长时间。你听说过这个过程中会出现“250ms的倍数等待时间”吗?请跳转传送门:GarbageCollectionThreadSuspensionDelay(250ms倍数)这种问题不进入VM修改是无法解决的。对于(1)的情况,其实即使在CLR不开源的情况下,CLR还是有可以配置的调优参数的。最经典的是选择试用WorkstationGC(WKSGC)或ServerGC(SVRGC)。你见过参数吗?之后可以配置使用ConcurrentGC、BackgroundWorkstationGC、BackgroundServerGC等。用户也可以通过代码中的GCSettings.LatencyMode属性来影响GC的行为。看,其中一个调优参数列表:RuntimeSettingsSchema但是,CLR和HotSpotVM在配置上有一个显着的区别,那就是CLR不要求用户指定“GC堆的最大大小”.这与CLR的GC堆的基本设计思想有关。HotSpotVM的GC堆必须使用连续的虚拟地址空间。VM在启动的时候会一次性预留GC需要的整个地址空间,然后按需commit。-Xmx会参与计算GC堆的最大大小。CLR的GC堆是分段的(segmented)。GC堆使用的空间会逐段分配,一个满了再分配一个新的;段不需要在连续的地址空间中。这样GC堆就可以根据需要自动增长或收缩,一直增长到虚拟地址空间耗尽或者达到配额为止。CLR的分段GC堆的好处是在Windows上,尤其是32位的Windows上,用户程序可以使用的那部分虚拟地址空间比较碎片化,想要用完,你不能对“连续地址”“空格”有太多要求。在这种情况下,运行在Windows上的CLR可以充分利用资源。并且通过这种方式,用户不必担心实现为CLR配置多少堆。反正需要用到多少,会自己增长的。这样的用户体验,总比绞尽脑汁想一个好的-Xmx好。这种做法的缺点……怎么可能没有缺点。也有一些缺点。其中之一就是在这样的堆上实现分代GC的写屏障效率会比使用连续地址空间的HotSpot差。而且分段堆实现起来也稍微复杂一些。CLR与JVM相比有什么优势?CLR与JVM相比有什么优势?-RednaxelaFX的回答-知乎https://www.zhihu.com/questio...这里R专业主要介绍CLR和JVM的区别,可以对应下面hez大佬的回答,虽然只写了一半是的最好先发出去,以免卡住。以后再讨论更新吧。。。本题原文为:CLR与JVM相比有什么优势?留下备份。首先,这个问题是无法回答的,因为CLR和JVM不是可比较的对象。CLR(CommonLanguageRuntime)是CLI(CommonLanguageInfrastructure)规范中VES(VirtualExecutionSystem)的具体实现,而“JVM”如果不具体说明实现,只能说是一种抽象规范。适合对比的对象有:规范级别:CLIvsJVM实现级别:CLR/Mono等vsHotSpotVM/J9VM/JRockitVM等从规范级别来看,最新版CLI规范ECMA-335是第一个版本于2012年发布。6个版本。我没有非常遵循新的CLI规范,所以我不确定哪个版本的CLI对应于.NETFramework中的哪个版本的CLR。最新版本的JVM规范Java?VirtualMachineSpecification是2015年发布的JavaSE8版本。在规范层面,当前的CLI击败了当前的JVM。《Virtual Machines: Versatile Platforms for Systems and Processes》这本书有一章比较了CLI和JVM的设计,值得一读。JVM规范是从Sun最初的JVM实现(后来称为ClassicVM)中抽象出来的,从那时起几乎没有发生重大变化。后来的更新主要是增加了Class文件中泛型信息的有限记录、注解支持、字节码验证器更新(拆分验证器/类型检查验证器)、invokedynamic和MethodHandle支持、默认方法支持等。虽然原来的JVM规范也提到它“可以supportmultiplelanguages”,主要目的是在Java中支持一种语言的执行。直到Java7加入了JSR292(invokedynamic和MethodHandle),它才专门针对Java之外的东西。语言设计的特点。CLI是从.NET最初的CLR实现中抽象出来的,然后随着CLR逐渐演化而来。毕竟它出现的时间比JVM规范要晚很多,而且本来就是为了支持多语言多范式的执行和互操作而设计的,自然设计得更加完美。对历史感兴趣的同学可以搜索“Project7”。采访者:我听说有一个项目,微软开始整合...DonSyme:那只是序列的一小部分。.NET平台的远景设计从一开始就被期望成为一个多语言平台。早在1998年,事实上,当我们的编程语言研究小组在微软成立时,我加入了团队,然后我们其他10个人也加入了团队,一个叫JamesPlamondon的人找到了我们,他开始了名为Project7的项目,这是关于让每一方都有7种学术编程语言和7种工业编程语言来针对.NET公共语言运行时,并真正检查它是否足够好,看看是否可以在.NET的设计过程的早期进行设计更改以确保它对一系列编程语言来说足够好。项目7的参与者尝试了将许多语言移植到CLR上,包括C、Pascal、Cobol(Fujitsu)、Fortran(Salford)、Haskell、StandardML、Eiffel、ActiveOberonfor.NET(ETH)、花园PointComponentPascal(QUT)等后来又有了更进一步的“Project7+”。CommonLanguageRuntime技术概述如果要追溯CLR更早的黑历史,就不得不提到微软的VisualJ++。请跳转传送门:当年微软的J++到底是什么?为什么Sun要起诉它?-RednaxelaFX的回答。列几个要点提醒以后更新...AssemblyvsClassfile常量池以流的形式存在并且可以有强名CIL(CommonIntermediateLanguage)/MSILvsJavabytecodeCIL不仅在规范中有二进制形式,也有标准的文本形式语法;Java字节码只有二进制形式的规范。局部变量区无论是什么类型的值,都使用一个槽,而JVM对long和double使用相邻的两个槽。异常处理支持filter支持具体化泛型OpenJDK:Valhallagenericssupportdeclaration-sitevariance(declaration-sitevariance)Java语言级别的Genericssupportuse-sitevariance)支持无符号整数类型(unsigned)和用户自定义值类型(valuetypes)OpenJDK:Valhalla支持为用户定义的值类型指定显式内存布局,并且可以模拟C的struct和union以实现互操作性(StructLayout)OpenJDK:Panama支持溢出检查算术(checkedarithmetic)不安全可验证代码支持轻量级代码生成(LCG,LightweightCodeGeneration)支持委托类型(Delegate/MulticastDelegate)单投CLIDelegate版本与Java7的MethodHandle有相似之处,支持方便的P/Invoke和ReverseP/InvokeOpenJDK:Panama做的不支持自定义类加载器。JVM上过于灵活的ClassLoader简直让人头疼,不支持就好了。CLI中隐藏的私货:Assembly采用PE(PortableExecutable)格式。PE是Windows上的本机可执行文件格式。CLR与Windows的集成WindowsLoader可以直接识别.NETAssembly并启动CLR来执行程序。Windows在文件系统层面对GAC(GlobalAssemblyCache),“Fusion”有特殊处理。与COM具有良好的互操作性。毕竟CLR本来是希望设计成下一代COM的,COR(COMObjectRuntime)这个名字本来就是用的。ChunkedGCHeap可以自动扩缩GC堆的大小,在Windows地址空间相对碎片化的环境下可以有效利用地址空间的空隙。相应地,JRockit在Windows上使用填充对象来利用间隙。GC堆被划分为多个空间,尤其是高频堆/低频堆(high-frequencyheap/low-frequencyheap)的划分很有意思。GC支持对象固定(ObjectPinning)GC提供API让应用程序指定native对象的内存压力,使GC和native可以协调工作(System.GC.AddMemoryPressureMethod(Int64))支持WindowsStructuredExceptionHandling(SEH)。CLR与一些JVM实现之间有对应的CLR:DAC/SOS扩展;HotSpotVM:可服务性代理;J9VM:DTFJ/jdmpviewCLR:CAS(代码访问安全)和JVM的沙箱