Java中有许多实践使我感到困惑。 这里只是一些。 使用-Xmx和-Xms
选项-Xmx广泛用于设置最大内存大小。 如Java HotSpot VM Options中所述,以-X开头的选项是非标准的(不保证在所有VM实现中均受支持),并且在以后的JDK发行版中,如有更改,恕不另行通知。
因此,您会认为这种广泛使用的选项将不再是非标准的。 实际上,有一个标准选项-mx和类似的-ms。 我不知道为什么这些标准选项没有得到更广泛的使用,甚至没有记载。
仅将NIO用于非阻塞IO
非阻塞IO是用于套接字的NIO的新功能。 但是,NIO套接字的默认行为是阻止。 文件仅在NIO中被阻止。 NIO2提供了一个异步接口,但是通过将您的请求传递给ExecutorService来实现(这实际上是在作弊,因为它什么也做不了您已经做不到的事情)
我个人更喜欢阻止NIO。 它仅在二进制连接数较少时才适用,但是按恕我直言,这是一种选择不多的选项。
使用32位JVM节省内存
使用32位JVM保存的内存量远远少于您的想象。 现代64位JVM默认情况下最多使用32位引用,最大堆大小为32 GB。 您不太可能希望拥有更大的堆大小(如果只是为了避免很长的完整GC时间)
与64位JVM相比,32位JVM的对象标头仍然较小,但是差别很小。 64位JVM可以使用更多,更大的寄存器(在AMD / Intel x64系统上),并且可以使用更大的地址空间,从而减少内存限制。
使用线程使一切更快
使用多个线程可以提高CPU利用率并减少IO延迟的影响。 它不能解决所有性能问题。 它不会使磁盘运行得更快,不会增加网络带宽,不会增加L3缓存的大小,不会增加CPU到主内存带宽的速度,也不会大大提高数据库的速度。
同样,使所有内容并发也不会有太大区别。 当您只有8个核心时,是否需要1000个并发集合? 不管您有多少个线程,一次都只能运行8个线程,如果您有1000个集合,则很有可能两个线程将使用同一集合。
对关键资源有选择地使用并发。 否则,您不仅有增加开销和降低应用程序速度的风险,而且还带来引入的复杂性增加的风险。
参考:来自Vanilla Java博客的JCG合作伙伴 Peter Lawrey在Java上的奇怪实践 。
翻译自: https://www.javacodegeeks.com/2012/06/odd-practices-in-java.html