jvm
文章平均质量分 70
天青色 等烟雨
这个作者很懒,什么都没留下…
展开
-
对象的 生 | 死
线程私有的程序计数器、虚拟机栈、本地方法栈随着线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊的执行者入栈和出栈。每一个栈帧中分配多少内存基本是在类结构确定下来时就已知的。,因此这几个区域的内存分配回收都具备确定性,在这几个区域内就不需要过多考虑垃圾回收的问题,当方法结束或者线程结束的时候,内存自然就跟着回收了。原创 2023-02-24 17:41:39 · 386 阅读 · 0 评论 -
Jvm -堆对象的划分
所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区,在《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组对象都应当在运行时分配在堆上。为对象分配内存是意见非常严谨和复杂的任务,jvm的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC完成垃圾回收后在内存空间产生的内存碎片。Java堆区域的大小在jvm启动时就已经被确定下来了,是jvm管理的最大的一块内存空间,但对的大小也是可以调节的。对GC指向垃圾回收的重点区域。原创 2023-02-18 16:53:41 · 735 阅读 · 0 评论 -
Class文件结构
常量池是class文件中内容最丰富的区域之一,随着Java虚拟机的不断发展,常量池的内容也不断丰富。同时,常量池对于Class文件中的字段和方法解析也有着至关重要的作用,可以说,常量池是整个class文件的基石。在版本号之后,紧跟着就是常量池的数量,以及若干个常量池表项。Java代码可以跨平台运行的基础就是因为jvm的跨语言特性,无论哪种语言编写的程序,只要能编译成class文件,就能通过Jvm在各种平台上运行。实现这一特性的关键就是同意而强大的Class文件结构,它是异构语言与jvm之间的重要桥梁。原创 2023-01-15 15:22:55 · 137 阅读 · 0 评论 -
【无标题】
无论是通过哪种方法退出,在方法推出后都要返回到方法被调用的位置,方法非正常退出时,调用着的pc计数器的值作为返回地址,即调用该方法指令的下一条指令的地址,而通过一场退出的,返回地址是要通过异常表来确定,栈帧中一般不会保存这部分信息。每一个操作数栈都会拥有一个明确的栈深度用于储存数值,其所需要的最大深度在编译时就定义好了,保存在方法的Code属性中名为max-stack的值。操作数栈就是jvm执行引擎的一个工作区,当一个方法开始执行的时候,一个新的栈帧也会随之被创建出来,这个方法的操作数栈是空的。原创 2022-12-11 12:39:53 · 308 阅读 · 0 评论 -
详解jvm的5种引用
在Java虚拟机中有5中常见的引用,强引用,软引用,弱引用,虚引用和终结器。强引用:直接引用。软引用和弱引用在没有没强引用引用且进行垃圾回收时,如果内存不足,软引用对象就会被垃圾回收,而弱引用只要进行垃圾回收就会被回收掉。虚引用虚引用并不会决定对象的生命周期,在任何时间内都会被回收掉在使用虚引用的时候,必须和引用队列一起使用,虚引用的构造器必须传入一个该类型的引用队列。一般用来跟踪垃圾回收的过程,在对象被垃圾回收时收到一个系统消息。程序可在收到某个虚引用对象被回收后做相应的措施。原创 2022-11-26 19:18:59 · 391 阅读 · 0 评论 -
JVM的内存结构
因为Java虚拟机是多线程的,多线程是通过线程流切换、分配处理器执行时间的方式来完成的,在任何一个确定的时间,一个处理器都只会执行一条线程种的指令,因此,为了线程切换后能回到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立储存,也就是所谓的。Java在执行Java程序时,会把他所管理的内存划分位若干个不同的数据区域,这些区域都有各自的用途、创建和销毁的时间,有的区域会随着虚拟机进程的启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁的。原创 2022-11-10 22:16:43 · 484 阅读 · 0 评论