
JVM
文章平均质量分 79
zikLDream
一个只会打代码的奥利奥
展开
-
为什么永久代要被元空间替代?
有些人认为方法区(如 HotSpot 虚拟机中的元空间或者永久代)是没有垃圾收集行为的,其实不然。《Java 虚拟机规范》对方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集。一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻。以前 sun 公司的 Bug 列表中,曾出现过的若干个严重的 Bug 就是由于低版本的 HotSpot 虚拟机对此区域未完全回收而导致内存泄漏。由于类的元数据分配在本地内存中,元空间的最大可分配空间就是系统可用内存空。...原创 2022-08-30 15:24:59 · 278 阅读 · 0 评论 -
面试官: jdk7之前与jdk8后的方法区有何变化?
首先明确:只有 Hotspot 才有永久代。 BEA JRockit、 IBMJ9 等来说,是不存在永久代的概念的。原则上如何实现方法区属于虚拟机实现细节,不受《Java 虚拟机规范》管束,并不要求统一 Hotspot 中方法区的变化:JRockit 是和 HotSpot 融合后的结果,因为 JRockit 没有永久代,所以他们不需要配置永久代随着 Java8 的到来, HotSpot VM 中再也见不到永久代了。但是这并不意味着类的元数据信息也消失了。这些数据被移到了一个与堆不相连的本地内存区域,这个区域原创 2022-08-26 21:35:56 · 551 阅读 · 0 评论 -
堆是分配对象的唯一选择么?
在《深入理解 Java 虚拟机》中关于 Java 堆内存有这样一段描述:随着 JIT 编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在 Java 虚拟机中,对象是在 Java 堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析( Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内。原创 2022-08-24 10:35:32 · 321 阅读 · 0 评论 -
VisualVM安装VisualGC插件
在我们安装的JDK中,提供了一个很棒的JVM调优工具,也就是 Java VisualVM,通过它我们能够看到很多关于我们Java程序的信息,比如查看 Eden,Survivor From, Survivor To区的空间使用情况,以及排查程序中那些对象造成OOM。原创 2022-08-23 17:10:30 · 661 阅读 · 0 评论 -
JVM内存模型详解
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。 即: - 每个线程:独立包括程序计数器、栈、本地栈。 - 线程间共享:堆、堆外内存(永久代或元空间、代码缓存)原创 2022-08-22 09:40:17 · 463 阅读 · 0 评论 -
类加载子系统
在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类ava.1ang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。原创 2022-08-21 12:02:53 · 112 阅读 · 0 评论