草庐IT

GC优化

全部标签

java - Java JIT 是否确定性地编译字节码——在同一台机器上每次运行都进行相同的优化?

JavaJIT是否在同一台机器上每次运行时都使用相同的优化来编译字节码?它是否考虑了给定时刻的CPU使用率等动态因素,还是每次都会进行相同的优化而不考虑临时因素? 最佳答案 不,优化是不确定的。即使您运行完全相同的单线程、完全确定性程序,JIT用来确定要优化哪些方法的采样器也可以选择不同的集合。另一件可以改变生成的机器代码的事情是代码引用的某些常量的实际内存位置。JIT可以发出直接访问这些内存位置的机器指令,从而导致不同遍的机器代码之间存在额外差异。研究人员使用JikesRVM通过使用名为CompilerReplay的功能解决了他们

TreeView 上 TreeItems 的 JavaFX 优化异步延迟加载

我有一个应用程序,其中有一个TreeView,其中有TreeItems持有大量叶子TreeItem。在TreeView中拥有大量的TreeItem会显着损害应用程序的性能,为了避免这种情况,我将做的是一次只允许展开一个非叶TreeItem,并且一旦TreeItem被折叠,我将清除它的子项,并在需要时异步加载它们(当用户展开TreeItem时)。奇怪的问题是,在下面的这个测试中,当我第一次点击treeitem上的展开箭头时,子项加载正常,如果我折叠它(这将清除子项)并再次展开它,有时它会工作和其他程序开始占用30%的CPU数分钟,然后恢复运行。更奇怪的是,如果我双击TreeItem将其展

java - C# 结构内存优化?

我参加了试用期面试(?我不确定是不是这个词)面试官让我告诉他结构和类之间的区别是什么。所以我告诉他我知道的一切以及我在msdn上看到的一切。那家伙说“还不够”,我一点头绪都没有。于是他说:struct是优化过的,所以如果有integer和float,有一些位相同,那么它会节省这个空间,所以structwithint=0和float=0是int=int.MAX的一半大小,float=float.MIN.好的。所以我当时想-没听说过。但是,在面试之后我在考虑它,但它对我来说并没有什么意义。这意味着,当我们更改其中某个变量的值时,结构大小会有所不同。而且在内存中也不可能真的在同一个地方,万一

java - GC 是否从 Metaspace 收集垃圾?

我一直认为垃圾收集器只清除堆,现在我这么认为。在java8中,permGen被删除并被Metaspace取代。据我所知,Metaspace是垃圾收集器(https://stackoverflow.com/a/24075360/2674303)谁从Metaspace收集垃圾? 最佳答案 我认为您的困惑源于口语化的术语“垃圾收集”,该术语被广泛使用但并未真正描述托管环境中发生的情况。内存管理是一个复杂的过程,它被简化为:识别哪些对象是垃圾,其实就是判断哪些对象可达(读作:不是垃圾),没有遇到的都认为是垃圾如有必要,将对象引用排队到引用队

java - Jmeter java.lang.OutOfMemoryError : GC overhead limit exceeded 错误

我正在使用Jmeter将工作负载注入(inject)部署在AWSEC2实例上的应用程序。测试必须非常庞大:它持续10个小时,工作负载配置文件具有双峰形状,5分钟内大约有2600个请求。实际上我有一个部署了应用程序的m3.xlarge实例和8个m3.xlarge实例,每个实例都运行一个jmeter实例。使用python脚本,要注入(inject)的工作负载被分配到8个客户端实例中,因此在示例中,如果原始工作负载注入(inject)800个请求,则每个jmeter实例将注入(inject)100个请求。正如我所说,完整测试持续10小时,并分为每个5分钟的时间步长。每5分钟应用一点工作量变化

java - 如何为长生命周期对象优化 Java gc

我的Java应用程序维护着一个可以增长到10GB的内部缓存。过期策略设置为30分钟或达到内存阈值时(我正在使用本地ehcache)。很明显,在30分钟后,所有缓存的对象都将在旧的gen中,并且需要完整的gc来收集它们。至于现在停止世界暂停可以达到6秒,我想减少它。平均对象大小为500k,但最多可达1兆,因此我们谈论的是10000-20000个缓存对象(实际上是字节数组)。GC优化的最佳策略是什么?我知道我可以脱离堆,但这是最后的解决方案。谢谢! 最佳答案 10GB缓存不是你应该在堆中做的事情。使用ByteBuffers用于缓存。对象

java - 为什么在使用 G1 GC 时推荐使用 Java 10?

Java10通过迭代改进其现有算法来减少FullGC暂停时间。-XX:ParallelGCThreads据我了解,G1不会与我们的应用程序同时运行其收集周期。它仍然会定期暂停应用程序,并且FullGC暂停会随着堆大小的增加而增加。那它是如何提高性能的呢?谁能解释一下? 最佳答案 因为直到Java10,G1GC才在stop-the-worldfullGC周期中完全并行。根据JEP307:ParallelFullGCforG1这改善了最坏情况下的延迟:TheG1garbagecollectorisdesignedtoavoidfullc

java - 空无限循环和 GC (JVM)。请说明效果

我的空无限循环publicstaticvoidmain(String[]args){while(true){}}并在JavaVisualVM中进行分析(图片)如您所见,我不创建对象。为什么要换一个堆?请解释一下效果。为什么? 最佳答案 基本上任何Java应用程序都是多线程的,您的主线程不分配内存这一事实并不意味着其他线程也不分配。事实上,很可能通过VisualVM附加并显示GC选项卡,您在VM中生成了一些线程来监视GC资源并为VisualVM提供成为那些Shiny图表的指标。而且该监控可能会分配一些自己的资源来完成它的工作。

java - 我可以启动一个 Eden 空间如此之大的 JVM,它运行到完成而没有任何 GC。假设我有一堆空闲内存

如果我有足够的空闲内存,我可以启动一个Java应用程序(说mMven)来单独使用Eden空间运行直到完成而不需要任何GC吗? 最佳答案 是的,我已经为Java6+中的实际应用程序完成了此操作。我从一个24GB的Eden空间、微型幸存者空间和永久空间开始。后来发现8GB绰绰有余。当有bug或错误时它仍然会GC,但在正常操作下不会。我相信选项是-Xmn24g-Xmx26g-XX:SurvivorRatio=100使用默认GC。该应用程序经过优化,生成的数据量低于1GB/小时,因此使用GC运行一天。

java - 优化 SSE 代码

我目前正在为需要一些性能改进的Java应用程序开发C模块(请参阅Improvingperformanceofnetworkcoding-encoding了解背景信息)。我已经尝试使用SSE-intrinsics优化代码,它的执行速度比Java版本(~20%)快一些。然而,它仍然不够快。不幸的是,我在优化C代码方面的经验有些有限。因此,我很想获得一些关于如何改进当前实现的想法。构成热点的内部循环如下所示:for(i=0;i 最佳答案 即使不查看程序集,我也能立即看出瓶颈来自4元素收集内存访问和_mm_set_epi32打包操作。在内部