我知道如何在Tomcat和Eclipse中设置Java堆大小。我的问题是为什么?在Java首次引入时,是否在初始堆上设置了任意限制,因此VM不会增长到一定的大小?现在大多数机器似乎都有大量的内存空间,这不是我们应该处理的事情 谢谢, 汤姆
答案 0 :(得分:5)
即使是现在,堆也不会无限制地增长。
当最老一代已满时,您应该扩展它还是仅仅GC?或者,如果GC没有释放任何内存,您应该只展开它吗?
.NET采用你喜欢的方法:你不能告诉它只使用一定数量的堆。有时感觉这是一个更好的主意,但有时候能够在同一台机器上拥有两个进程并且知道它们都不能占用整个内存是很好的...
答案 1 :(得分:4)
前几天我瞥了一眼,但我不确定这是不是你想要的:-XX:+AggressiveHeap
。 According to Sun:
此选项指示JVM推送 内存使用达到极限:整体 堆是超过3850MB, 每个线程的分配区域是 256K,内存管理策略 尽可能延迟收集, 和(从J2SE 1.3.1_02开始) 一些GC活动是并行完成的。
因为此选项设置堆大小,所以 不要使用-Xms或-Xmx选项 与-XX:+ AggressiveHeap结合使用。 这样做会导致选项 覆盖彼此的设置 堆大小。
我不确定这是否真的意味着我认为它意味着什么 - 你可以让JVM吞噬堆空间直到它满意为止。但是,在大多数情况下,这听起来不是一个很好的选择。
答案 2 :(得分:0)
我认为能够提供限制是好的,这样如果你遇到内存问题,它就不会占用所有系统内存,只留下重启选项。
答案 3 :(得分:0)
Java是一个跨平台系统。某些系统(如Unix和derviates)具有ulimit
命令,允许您限制进程可以使用的内存量。其他人没有。另外,Java有时是嵌入式的,例如在Web浏览器中。你不希望一个破碎的applet关闭你的桌面(好吧,至少这个想法,但applets从未真正流行,但这是另一个故事)。从本质上讲,此选项是sandboxing的关键基石之一。
因此,VM开发人员需要一个可移植的解决方案:他们为VM添加了一个选项,允许任何人(用户,管理员,Web浏览器)控制VM可以分配多少RAM。 Java的各种用途的需求太多了,不适合所有人。
今天看看移动设备时,这一点变得更加重要。您的桌面有2-8GB内存,但您的手机可能要少得多。对于这些事情,你真的不希望一个糟糕的应用程序关闭设备,因为甚至可能没有用户可以检查。