JVM
文章平均质量分 73
crazyK.
代码小白
展开
-
对象的创建过程
我们常常用new方式去创建一个对象,下面从JVM的角度来看看创建(new)一个对象的过程Student student = new Student();1.类加载检查虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程2.分配内存分配内存图解见:HotSpot虚拟机中的对象_crazyK.的博客-CSDN博客在类加载检查通过...原创 2022-05-07 09:54:04 · 401 阅读 · 0 评论 -
Native关键字
引出场景,创建一个线程并使其就绪public class Test { public static void main(String[] args) { Thread thread = new Thread(); thread.start(); }}按住crlt进入Thread类查看start()方法public synchronized void start() { /** * This method is原创 2022-03-24 15:08:06 · 380 阅读 · 0 评论 -
双亲委派模型
下图展现的就是双亲委派模型三种类加载器在:JVM --类加载器_crazyK.的博客-CSDN博客中已经提到过。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。双亲委派模型的工作流程是:如果一个类加载器收到了类加载的请求,它首先不会自己尝试去加载这个类,而是把这个类委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去完成加载用大.原创 2022-03-24 12:36:09 · 153 阅读 · 0 评论 -
类加载器。
目录一、类加载器类加载器的作用:1.启动类加载器2.扩展类加载器3.应用程序类加载器二、操作实例一、类加载器类加载器的作用:简单得说类加载器就是用于实现类的加载动作。绝大多数Java程序都会使用到以下3个系统提供的类加载器来进行加载。1.启动类加载器这个类加载器负责加载存放在 \lib目录,或者被-Xbootclasspath参数所指定的路径中存放的,而且是Java虚拟机能够 识别的类库加载到虚拟机的内存中。启动类加载器无法被Java程...原创 2022-03-20 20:42:32 · 1211 阅读 · 2 评论 -
Class类文件的结构
Class文件是一组以8个字节位基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符。一、魔数与Class文件的版本每个Class文件的头4个字节被成为魔术,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。紧接着魔术的4个字节存储的是Class文件的版本号:第5和第6个字节是次版本号,第7和第8个字节是主版本号,Java版本号是从45开始的。下图显示的是使用十六进制编辑器WinHex打开这个Class...原创 2022-03-20 13:11:51 · 549 阅读 · 0 评论 -
分代收集理论
1.弱分代假说:绝大多数对象都是朝生夕灭的。2.强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡。这两个分代假说共同奠定了多款常用垃圾收集器的一致设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据年龄(即对象熬过垃圾回过程的次数)分配到不同的区域之中存储。3.跨代引用假说:跨代引用相对于同代引用来说仅占极少数。 依据这条假说,不应再为了少量的跨代引用去扫描整个老年代,也不必浪费空间专门记录每一个对象是否存在哪些跨代引用,只需在新生代上建立一个全局的数据结构...原创 2022-03-20 10:18:29 · 387 阅读 · 0 评论 -
经典垃圾收集器
各款收集器之间的关系一、Serial收集器Serial收集器使最基础、历史最悠久的垃圾收集器,曾经在JDK1.3.1之前是HotSpot虚拟机新生代收集器的唯一选择。这个收集器是一个单线程工作的收集器,它在进行垃圾回收时,必须暂停其他所有的工作线程,称为 "Stop The World"。但是简单高效,对于内存资源环境受限的环境,它是所有收集器里额外内存消耗最小的。二、ParNew收集器ParNew收集器实质上是Serial收集器的多线程并行版本...原创 2022-03-19 13:14:43 · 213 阅读 · 0 评论 -
垃圾收集算法
一、新生代和老年代新生代:主要存放新创建的对象,内存大小相对比较小,垃圾回收频繁。老年代:存放生命周期比较长的对象,内存大小相对比较大,垃圾回收也没有那么频。两者联系:在新生代中,每次垃圾收集时都发现有大批对象死去,而每次回收后存活少量的对象,及那个会逐步晋升到老年代中存放。 跨代引用:跨代引用是指新生代中存在对老年代对象的引用,或者老年代中存在对新生代的引用。二、标记 - 清除算法如名字一样,此算法分为“...原创 2022-03-18 14:54:44 · 278 阅读 · 0 评论 -
对象已死?
目录一、引用计数算法二、可达性分析算法三、Java中的引用3.1强引用3.2软引用3.3弱引用3.4虚引用四、生存还是死亡在堆里存放着Java中几乎所有对象,垃圾回收器在对堆进行回收之前,会先判断堆中的对象哪些还活着,哪些已经死去(不可再被任何途径使用的对象)。一、引用计数算法在对象中添加一个计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何计数器值为零的对象就是不可再被只用的。当n的执指向为空时,取消...原创 2022-03-18 13:18:44 · 118 阅读 · 0 评论 -
HotSpot虚拟机中的对象
目录一、对象的创建1.1指针碰撞1.2 空闲列表二、对象的内存布局2.1对象头2.2实例数据2.3对齐填充三、对象的访问定位3.1使用句柄3.2直接指针3.3两者区别一、对象的创建类加载完成之后,虚拟机将为新生对象分配内存。在虚拟机中有两种分配内存的方式,分别为指针碰撞和空闲列表。1.1指针碰撞假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,...原创 2022-03-15 16:30:49 · 1849 阅读 · 0 评论 -
java内存区域
目录一、概述二、运行时数据区域2.1Java虚拟机栈2.2本地方法栈2.3Java堆2.4方法区2.5运行时常量池一、概述Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 依赖用户线程的启动和结束而建立和销毁。二、运行时数据区域2.1Java虚拟机栈Java虚拟机栈是线程私有的,它的生命周期与线程相...原创 2022-03-15 12:25:29 · 1003 阅读 · 0 评论