我试图理解Java堆术语中年轻,老一代和永久世代的概念,更具体地说是三代之间的相互作用.
我的问题是:
首先,Perm空间和堆空间之间有什么区别(JVM选择使用每个内存空间的内容和方式)?
其次,但最重要的是,对于标准MVC类型的Java应用程序,建议使用什么样的比率?
有什么区别
-Xms4096m
-Xmx2048M
-XX:MaxPermSize=712M
Run Code Online (Sandbox Code Playgroud)
我越来越糊涂这两个-Xmx2048M和-XX:MaxPermSize=712M
如果我使用-Xmx2048 M或-Xmx2048 将会发生m
当我们使用数组创建列表时java.util.Arrays.asList(),列表是不可变的.我很想知道为什么我们想要创建一个不可变列表,当List(Set或Map)的基本目的是具有动态大小并且能够随意添加,删除元素时.当我们需要一个固定大小的数据结构,我们去阵列,当我们需要一个动态的数据结构,我们去List或Set或Map等.那么,什么是具有不可变列表的目的是什么?我在完成任务时遇到了这个问题.
在探索了java的字符串内部结构后,我对所谓的"烫发空间"感到困惑.我最初的理解是它保留了String 文字以及类元数据,如本问题所述.
我还阅读了有关该String.intern()方法的内容,并将其String放入String Pool中,返回对它的唯一实例的引用.我的理解是,这是与JVM的perm空间中存在的字符串文字相同的字符串池.对我来说,"烫发空间"可以修改是不可能的(毕竟它是永久性的,是吗?).但后来我发现这个问题,EJP对接受的答案的最高投票评论解释了这一点
现在,实习生的字符串已经可以用GC了.
暗示GC在perm空间上运行,这似乎不是永久性的.这如何调和?GC是否检查了烫发空间中的所有内容?GC是否检查字符串池中的所有内容,包括源中的字符串文字?内联字符串是否有第二个字符串池?GC是否只知道在收集时查看实习生的字符串?或者这个评论是错误的并且实际上是一个字符串阻止它成为GC'd(我希望不是这种情况)?
下面是其中的一部分hs_err_pid
Heap
PSYoungGen total 13888K, used 9807K [0x8a330000, 0x8b140000, 0x914f0000)
eden space 13504K, 69% used [0x8a330000,0x8ac67710,0x8b060000)
from space 384K, 96% used [0x8b0e0000,0x8b13c6e0,0x8b140000)
to space 448K, 0% used [0x8b060000,0x8b060000,0x8b0d0000)
PSOldGen total 115456K, used 57684K [0x514f0000, 0x585b0000, 0x8a330000)
object space 115456K, 49% used [0x514f0000,0x54d451c0,0x585b0000)
PSPermGen total 16384K, used 11253K [0x4d4f0000, 0x4e4f0000, 0x514f0000)
object space 16384K, 68% used [0x4d4f0000,0x4dfed618,0x4e4f0000)
Run Code Online (Sandbox Code Playgroud)
什么是
java ×6
jvm ×4
arrays ×1
collections ×1
gcc ×1
heap ×1
heap-memory ×1
list ×1
memory ×1
performance ×1
string ×1
tomcat ×1