
JVM
文章平均质量分 88
JVM相关文章
_whitepure
这个作者很懒,什么都没留下…
展开
-
内存泄漏详解
内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成内存空间的浪费。严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践会导致对象的生命周期变得很长,甚至导致00M,也可以叫做宽泛意义上的“内存泄漏”。举个例子,创建的连接不再使用时,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。忘记关闭这些资源会导致持续占有内存,无法被GC回收。这样就会导致内存泄露,最终导致内存溢出。try{原创 2024-07-23 10:54:03 · 4730 阅读 · 1 评论 -
JVM详解
除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展,以满足自己的特殊需求。就比如说,我们可以对 Java 类的字节码(.class文件)进行加密,加载时再利用自定义的类加载器对其解密。隔离加载类修改类加载的方式扩展加载源防止源码泄漏若要实现自定义类加载器,只需要继承类,按需重写相关方法即可。如果不想打破双亲委派模型,那么只需要重写findClass方法如果想打破双亲委派模型,那么就重写整个loadClass方法。原创 2024-06-26 10:46:55 · 1390 阅读 · 0 评论 -
JVM介绍
HotSpot VM既继承了Sun之前两款商用虚拟机的优点(如前面提到的准确式内存管理),也有许多自己新的技术优势, 如它名称中的HotSpot指的就是它的热点代码探测技术,HotSpot VM的热点代码探测能力可以通过执行计数器找出最具有编译价值的代码,然后通知JIT编译器以方法为单位进行编译。垃圾收集机制为我们打理了很多繁琐的工作,大大提高了开发的效率,但是,垃圾收集也不是万能的,懂得JVM内部的内存结构、工作机制,是设计高扩展性应用和诊断运行时问题的基础,也是Java工程师进阶的必备能力。原创 2021-03-27 18:19:10 · 328 阅读 · 1 评论 -
Java类加载机制
除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展,以满足自己的特殊需求。就比如说,我们可以对 Java 类的字节码( .class 文件)进行加密,加载时再利用自定义的类加载器对其解密。隔离加载类;修改类加载的方式;扩展加载源;防止源码泄漏;若要实现自定义类加载器,只需要继承类,按需重写相关方法即可。如果不想打破双亲委派模型,那么只需要重写findClass方法;如果想打破双亲委派模型,那么就重写整个loadClass方法;原创 2021-03-28 15:44:00 · 126 阅读 · 1 评论 -
JVM中的程序计数寄存器
我们都知道所谓的多线程在一个特定的时间段内只会执行其中某一个线程的方法,CPU会不停地做任务切换,这样必然导致经常中断或恢复,如何保证分毫无差呢?由于Java的多线程是通过线程轮流切换完成的,一个线程没有执行完时就需要一个东西记录它执行到哪了,下次抢占到了CPU资源时再从这开始,这个东西就是程序计数器,正是因为这样,所以它也是“线程私有”的内存。由于CPU时间片轮限制,众多线程在并发执行过程中,任何一个确定的时刻,一个处理器或者多核处理器中的一个内核,只会执行某个线程中的一条指令。原创 2021-03-30 21:06:39 · 282 阅读 · 1 评论 -
JVM中的执行引擎
概述执行引擎是Java虚拟机核心的组成部分之一,属于JVM的下层,里面包括 解释器、及时编译器、垃圾回收器。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CisEiYea-1618896537854)(/myblog/posts/images/essays/执行引擎.png)]“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以原创 2021-04-21 11:25:32 · 426 阅读 · 1 评论 -
JVM中的本地方法栈
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。运行时数据区域包括程序计数寄存器虚拟机栈本地方法栈堆方法区其中:方法区、堆为线程共享;程序计数寄存器、虚拟机栈、本地方法栈 为线程私有。本地方法栈概览Java虚拟机栈于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。本地方法栈,也是线程私有的。允许被实现成固定或原创 2021-05-07 18:18:43 · 205 阅读 · 1 评论 -
JVM中虚拟机栈详解
Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。运行时数据区域包括程序计数寄存器虚拟机栈本地方法栈堆方法区其中:方法区、堆为线程共享;程序计数寄存器、虚拟机栈、本地方法栈 为线程私有。虚拟机栈介绍Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈原创 2021-04-05 17:38:21 · 225 阅读 · 1 评论 -
JVM中堆详解
Minor GC:新生代的GC;Major GC:老年代的GC;Full GC:整堆收集,收集整个Java堆和方法区的垃圾;JVM调优的一个环节,也就是垃圾收集,我们需要尽量的避免垃圾回收,因为在垃圾回收的过程中,容易出现 STW 的问题。Major GC 和 Full GC出现 STW 的时间,是Minor GC的10倍以上。JVM在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是指新生代。原创 2021-04-08 21:52:59 · 475 阅读 · 1 评论 -
JVM中的本地方法接口
通过使用本地方法,我们得以用Java实现了jre的与底层系统的交互,甚至JVM的一些部分就是用C写的。本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C++程序。Java使用起来非常方便,然而有些层次的任务用Java实现起来不容易,或者我们对程序的效率很在意时,问题就来了,可以使用本地方法解决。这是一个本地方法的具体实现由JVM直接提供,更多的情况是本地方法由外部的动态链接库提供,然后被JVM调用。方法是用Java实现的,但是它实现调用的是该类里的本地方法。原创 2021-04-03 16:32:59 · 156 阅读 · 1 评论 -
JVM中的直接内存
直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。通常,访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。Java的NIO库允许Java程序使用直接内存,用于数据缓冲区。Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。由于直接内存在Java堆外,因此它的大小不会直接受限于。使用NIO,通过存在堆中的直接内存操作本地内存。指定的最大堆大小,但是系统内存是有限的,原创 2021-04-17 13:42:57 · 114 阅读 · 1 评论 -
JVM中的方法区详解
方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。《Java虚拟机规范》对方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集。在编译的时候每个java类都会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,所以就用符号引用来代替,而在这个解析阶段就是为了把这个符号引用转化成为真正的地址的阶段。原创 2021-04-17 13:39:12 · 257 阅读 · 1 评论 -
JVM中的垃圾回收机制
垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存爆掉。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。如果不及时对内存中的垃圾进行清理,那么这些垃圾对象所占的内存空间会一直保留到应用程序的结束,被保留的空间无法被其它对象使用,甚至可能导致内存溢出。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。垃圾收集机制是Java的招牌能力,极大地提高了开发效率。原创 2024-06-20 17:56:51 · 735 阅读 · 0 评论 -
JVM中的垃圾回收器
从名字中的Mark Sweep这两个词可以看出,CMS 收集器是一种 “标记-清除”算法实现的,以获取最短回收停顿时间为目标,采用“标记-清除”算法,分 4 大步进行垃圾收集,其中初始标记和重新标记会 STW,JDK 1.5 时引入,JDK9 被标记弃用,JDK14 被移除。是一个单线程的收集器,但它的“单线程”的意义并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。不过,默认的垃圾回收器依然是 G1。原创 2024-06-20 17:42:51 · 1483 阅读 · 0 评论 -
JVM中的一些概念
System.gc在默认情况下,通过System.gc()者Runtime.getRuntime().gc()的调用,会显式触发FullGC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。源码调用了Runtime.getRuntime().gc();方法运行垃圾收集器。调用GC方法意味着Java虚拟机要努力回收未使用的对象,以便使它们当前占用的内存能够快速重用。当控制从方法调用中返回时,Java虚拟机已经尽了最大努力从所有丢弃的对象中回收空间。调用System.gc()有效地等同于原创 2021-05-05 22:19:15 · 166 阅读 · 1 评论 -
从JVM角度理解Java对象
然后执行对象的显式初始化,包括声明时的初始化表达式、执行对象中的初始化代码块,最后执行对象的构造方法,构造方法用于完成对象的最终初始化,可以初始化对象的实例变量。在64位JVM下,通过测试的结果我们可以看到Java对象的布局对象头占12byte了,因为JVM规定内存分配的字节必须是8的倍数,否则无法分配内存,所以就出现了4byte的对齐数据。如果是数组,还需要记录数组的长度。句柄访问是在栈的局部变量表中,记录的对象的引用,然后在堆空间中开辟了一块空间,也就是句柄池,指向的是方法区中的对象类型数据。原创 2021-04-17 16:12:53 · 403 阅读 · 1 评论