IntelliJ IDEA
jdk1.8
java 虚拟机 (jvm) 是运行程序的平台。它是为特定的操作系统和体系结构而构建的, 位于操作系统和您编写的任何编译程序或应用程序之间, 使其成为不可知论。java 程序被编译 (使用 javac) 到字节码。jvm 将此解释为该体系结构和操作系统的具体说明。
其他编译的语言 (如 c++ 或 Objective-C) 需要编译才能使用定义的主机体系结构和操作系统运行, 但 java 的情况并非如此。无论在哪个平台编译 java 代码, 它都可以在相同或更高版本的任何 jvm 上运行。
考虑到这就是代码运行的位置, 了解 jvm 的工作原理以及如何调整某些参数以获得代码的最佳性能非常重要。
new关键字在 java 堆上分配内存。堆是内存的主池, 可供整个应用程序访问。如果没有足够的内存可用于为该对象分配, jvm 将尝试使用垃圾回收从堆中回收一些内存。
如果它仍然无法获得足够的内存, 则会引发 outofmemoryerror, 然后退出 jvm。堆被拆分为几个不同的部分, 称为代。随着对象在更多垃圾回收中生存, 它们被提升到不同的代。老年代不是经常被垃圾收集的。因为这些对象已经被证明寿命更长, 所以它们被垃圾回收的可能性较小。
当对象首次构造时, 它们被分配在Eden Space(伊甸园)空间中。如果他们在垃圾收集中幸存下来, 他们就会被提升到Survivor Space(幸存者区)空间, 如果他们在那里活得足够长, 他们就会被分配给Tenured Gen(老年代-养老区)。这一代垃圾收集的频率要低得多。
还有第四代, 叫 '永久一代', 也就是 permgen。驻留在此处的对象不符合垃圾回收的条件, 通常包含运行 jvm 所需的不可变状态, 如类定义和 string 常量池。请注意, permgen 空间已经从 java 8 中删除, 并替换为一个名为 metaspace(元空间) 的新空间, 该空间将保存在本机内存中。
jdk1.8内存分配不同之前版本的分配方式