Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多线程应用程序的有用JVM选项是什么?_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 多线程应用程序的有用JVM选项是什么?

Java 多线程应用程序的有用JVM选项是什么?,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我正在开发一个创建大量线程并严重依赖字符串操作的应用程序。 该应用程序一次可以工作24小时,并且需要始终保持非常高的响应速度。 我试图将对象的创建量控制在最低限度。目前应用程序在没有任何配置的情况下运行良好 但我想知道,就我自己所知,使用特定的JVM配置是否有任何优势(或劣势? 请耐心听我说,我对JVM/GC配置这一主题相当陌生: 我想知道在使用多线程时是否有任何JVM选项是绝对应该使用的? 我应该配置堆吗? 我还应该配置GC吗 我应该尽量减少垃圾收集吗 我开始读: 关于这个问题的任何提示都



我正在开发一个创建大量线程并严重依赖字符串操作的应用程序。
该应用程序一次可以工作24小时,并且需要始终保持非常高的响应速度。
我试图将对象的创建量控制在最低限度。目前应用程序在没有任何配置的情况下运行良好

但我想知道,就我自己所知,使用特定的JVM配置是否有任何优势(或劣势?

请耐心听我说,我对JVM/GC配置这一主题相当陌生:
  • 我想知道在使用多线程时是否有任何JVM选项是绝对应该使用的?
  • 我应该配置堆吗?
  • 我还应该配置GC吗
  • 我应该尽量减少垃圾收集吗

    我开始读:
    关于这个问题的任何提示都将不胜感激


    提前感谢,

    一般来说,关于调整JVM的最佳初始建议是不要。除非您在默认设置中遇到与JVM相关的特定问题,否则不要理会它们

    如果您确实需要修改设置,我建议您设置一个具有代表性的测试用例,并使用高级分析器,例如


    此外,您应该真正阅读有关HotSpot VM的技术文档,特别是内存管理白皮书,您可以找到所有这些文档。

    一般来说,关于调整JVM的最佳初始建议是不要。除非您在默认设置中遇到与JVM相关的特定问题,否则不要理会它们

    如果您确实需要修改设置,我建议您设置一个具有代表性的测试用例,并使用高级分析器,例如


    此外,您应该真正阅读有关HotSpot VM的技术文档,特别是内存管理白皮书,您可以找到所有这些文档。

    如果它工作正常,那么您不应该做任何事情。

    如果应用程序受CPU限制,则不应创建大量线程。 原因是在上下文切换中浪费了很多时间。 字符串操作如果它在内存中,那么应该只有那些需要的线程

    NCPU = UCPU* (1+W/C)
    
    Where  NCPU--> Number of CPU
    UCPU--> Target CPU Utilization
    W-->Wait time
    C--> Compute time
    
    因此,对于CPU限制的操作,它应该是max(CPU数量+1)线程


    此外,在Java并发实践中,还为并发应用程序定义了许多测试用例。您可能需要检查这些功能。

    如果工作正常,则不应执行任何操作。

    如果应用程序受CPU限制,则不应创建大量线程。 原因是在上下文切换中浪费了很多时间。 字符串操作如果它在内存中,那么应该只有那些需要的线程

    NCPU = UCPU* (1+W/C)
    
    Where  NCPU--> Number of CPU
    UCPU--> Target CPU Utilization
    W-->Wait time
    C--> Compute time
    
    因此,对于CPU限制的操作,它应该是max(CPU数量+1)线程

    此外,在Java并发实践中,还为并发应用程序定义了许多测试用例。你可能想检查一下

    我想知道在使用多线程时是否有任何JVM选项是绝对应该使用的

    没有

    我应该配置堆吗

    不,除了将堆大小设置为合理的大小(使用-Xmx和-Xms)

    我还应该配置GC吗

    不,除非你特别需要“低停顿”。如果您当前正在实现“响应性”目标,那么默认吞吐量编译器是最佳选择。如果你没有达到这些目标,那么你应该考虑CMS或G1…但请注意,它们会减少暂停,但也会降低吞吐量

    我应该尽量减少垃圾收集吗


    不,这不是一个明智的目标。您的目标是最大化吞吐量,而最小化GC不一定能实现这一点。在很多情况下,生成垃圾比让应用程序做额外的工作来避免生成垃圾更有效。(正如Peter Lawrey指出的,在编写和维护复杂模式代码方面,您还需要额外的开发人员工作。)


    我建议您使用探查器来查看您的应用程序相对于其他生产性工作是否花费了大量时间(CPU时间或运行时间)。如果没有,或者如果应用程序已经运行得足够快,那么不要摆弄JVM选项

    如果您担心您的应用程序在将来无法应付不断增加的负载,那么调整GC就无法扩展。一个更好的选择是研究扩大硬件规模和/或找出如何在多台机器上完成工作。此外,调整GC以提高当前负载的性能实际上可能会在负载增加时导致性能下降。(考虑一下CMS出现的问题,当它无法跟上并被迫对world collection进行全面恢复时。)


    最后,有很多线程通常是个坏主意。最好使用少量工作线程(大约等于处理器/内核的数量),并通过并发队列等方式为它们提供工作

    我想知道在使用多线程时是否有任何JVM选项是绝对应该使用的

    没有

    我应该配置堆吗

    不,除了将堆大小设置为合理的大小(使用-Xmx和-Xms)

    我还应该配置GC吗

    不,除非你特别需要“低停顿”。如果您当前正在实现“响应性”目标,那么默认吞吐量编译器是最佳选择。如果你没有达到这些目标,那么你应该考虑CMS或G1…但请注意,它们会减少暂停,但也会降低吞吐量

    我应该尽量减少垃圾收集吗

    不,这不是一个明智的目标。您的目标是最大化吞吐量,而最小化GC不一定能实现这一点。在很多情况下,它更有效