通过GC调优,我成功地获得了实时Java应用程序的性能,并避免了可识别的GC暂停.但是,这可以容纳大约20 GB的堆空间.
硬件成本的降低使得即使是100GB的RAM机也能负担得起.但是,由于GC暂停,仍然使用Java,更高的堆大小(如50 GB)会让您经常陷入噩梦.
我知道有像堆外和分布式堆这样的选项.但是,堆外具有se/derial的缺点,并且手上的分布式堆增加了维护成本.此外,在分布式堆中,您实际上并没有充分利用RAM(比如64 GB),而这些日子正变得越来越普遍.
因此,为了充分利用RAM的潜力,Java应用程序的垂直扩展有哪些好的解决方案?
有什么办法可以让我在StringBuilder中存储字符数组,以避免在执行toString()时创建它的副本。由于它是一个原始数组,因此就像深度复制一样,我希望避免生成此垃圾。
我观察到,当没有最近的ParNew,然后如果CMS-Initial-Mark阶段启动时,CMS-Initial-Mark阶段需要更长的时间来标记旧代中的对象.
好的部分是最让我发现ParNew时代(可能是偶然或JVM在内部这一点)正好出现CMS-初始标记阶段之前,然后标记相同数量的老一代对象时,CMS花费较少的时间.
想知道这一观察背后的推理.
注意:考虑到CMS-Initial-Mark阶段是停止世界,应该尽最大努力减少其持续时间.