
JVM
文章平均质量分 88
学习java虚拟机知识,基于深入理解java虚拟机一书
java小罗_江西南昌
通过看博客来学习知识,通过写博客来进行阶段性的积累,通过回顾来熟悉运用。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
17.垃圾回收器
垃圾收集机制是Java的招牌能力,极大地提高了开发效率。这当然也是面试的热点。那么,Java常见的垃圾收集器有哪些?GC垃圾收集器是和JVM一脉相承的,它是和JVM进行搭配使用,在不同的使用场景对应的收集器也是有区别这种垃圾收集器大家了解,现在已经不用串行的了。而且在限定单核cpu才可以用。现在都不是单核的了。对于交互较强的应用而言,这种垃圾收集器是不能接受的。一般在Java web应用程序中是不会采用串行垃圾收集器的。截止JDK1.8,一共有7款不同的垃圾收集器。原创 2025-02-10 16:40:32 · 1105 阅读 · 0 评论 -
3.运行时数据区概述及线程
本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区也就是大厨做饭,我们把大厨后面的东西(切好的菜,刀,调料),比作是运行时数据区。而厨师可以类比于执行引擎,将通过准备的东西进行制作成精美的菜品。原创 2025-02-06 13:37:57 · 426 阅读 · 0 评论 -
9.JVM-方法区
百度 三面:说一下JVM内存模型吧,有哪些区?分别干什么的?蚂蚁金服: Java8的内存分代改进 JVM内存分哪几个区,每个区的作用是什么?一面:JVM内存分布/内存结构?栈和堆的区别?堆的结构?为什么两个survivor区?二面:Eden和survior的比例分配小米: jvm内存分区,为什么要有新生代和老年代字节跳动: 二面:Java的内存分区 二面:讲讲vm运行时数据库区 什么时候对象会进入老年代?京东: JVM的内存结构,Eden和Survivor比例。原创 2025-02-08 09:35:12 · 871 阅读 · 0 评论 -
6.本地方法接口
简单地讲,一个Native Methodt是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "c" 告知c++编译器去调用一个c的函数。原创 2025-02-06 14:33:56 · 414 阅读 · 0 评论 -
8.堆的核心概念
针对幸存者s0,s1区的总结:复制之后有交换,谁空谁是to关于垃圾回收:频繁在新生区收集,很少在老年代收集,几乎不再永久代和元空间进行收集新生代采用复制算法的目的:是为了减少内碎片从内存模型而不是垃圾收集的角度,对Eden区域继续进行划分,JVM为每个线程分配了一个私有缓存区域,它包含在Eden空间内。多线程同时分配内存时,使用TLAB可以避免一系列的非线程安全问题,同时还能够提升内存分配的吞吐量,因此我们可以将这种内存分配方式称之为快速分配策略。原创 2025-02-07 09:07:58 · 781 阅读 · 0 评论 -
11.直接内存
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是在Java堆外的、直接向系统申请的内存区间。来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存通常,访问直接内存的速度会优于Java堆。即读写性能高。使用下列代码,直接分配本地内存空间。原创 2025-02-10 09:00:04 · 360 阅读 · 0 评论 -
13.StringTable
总结string的intern()的使用:JDK1.6中,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址JDK1.7起,将这个字符串对象尝试放入串池。如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址在JDK6中,在字符串常量池中创建一个字符串 “ab”原创 2025-02-10 11:06:59 · 359 阅读 · 0 评论 -
4.程序计数器
JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。这里,并非是广义上所指的物理寄存器,或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子),并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。它是一块很小的内存空间,几乎可以忽略不记。也是运行速度最快的存储区域。原创 2025-02-06 14:00:25 · 400 阅读 · 0 评论 -
7.本地方法栈
因为Java虚拟机规范并没有明确要求本地方法栈的使用语言、具体实现方式、数据结构等。如果JVM产品不打算支持native方法,也可以无需实现本地方法栈。它的具体做法是Native Method Stack中登记native方法,在Execution Engine 执行时加载本地方法库。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。它和虚拟机拥有同样的权限。在Hotspot JVM中,直接将本地方法栈和虚拟机栈合二为一。本地方法栈,也是线程私有的。本地方法是使用C语言实现的。原创 2025-02-07 09:06:26 · 182 阅读 · 0 评论 -
12.执行引擎
当Java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。JIT(Just In Time Compiler)编译器:就是虚拟机将源代码直接编译成和本地机器平台相关的机器语言。一般来讲,JIT编译出来的机器码性能比解释器搞C2编译器启动时长比C1慢,系统稳定执行以后,C2编译器执行速度远快于C1编译器自JDK10起,HotSpot又加入了一个全新的及时编译器:Graal编译器。原创 2025-02-10 10:21:17 · 1029 阅读 · 0 评论 -
5.虚拟机栈概述
程序试图访问或修改一个属性或调用一个方法,这个属性或方法,你没有权限访问。一般的,这个会引起编译器异常。这个错误如果发生在运行时,就说明一个类发生了不兼容的改变。原创 2025-02-06 14:10:42 · 813 阅读 · 0 评论 -
10.对象实例化内存布局与访问定位
如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为key进行查找对应的 .class文件,如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class对象。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。直接指针是局部变量表中的引用,直接指向堆中的实例,在对象实例中有类型指针,指向的是方法区中的对象类型数据。如果是数组,还需要记录数组的长度。原创 2025-02-10 08:42:02 · 549 阅读 · 0 评论 -
14.垃圾回收概述
在提到什么是垃圾之前,我们先看下面一张图从上图我们可以很明确的知道,Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。哪些内存需要回收?什么时候回收?如何回收?垃圾收集机制是Java的招牌能力,极大地提高了开发效率。原创 2025-02-10 11:15:04 · 695 阅读 · 0 评论 -
16.垃圾回收相关概念
强引用可以直接访问目标对象。强引用所指向的对象在任何时候都不会被系统回收,虚拟机宁愿抛出OOM异常,也不会回收强引用所指向对象。强引用可能导致内存泄漏。原创 2025-02-10 13:55:58 · 849 阅读 · 0 评论 -
15.垃圾回收相关算法
总结一句话就是,除了堆空间外的一些结构,比如 虚拟机栈、本地方法栈、方法区、字符串常量池 等地方对堆空间进行引用的,都可以作为GC Roots进行可达性分析除了这些固定的GC Roots集合以外,根据用户所选用的垃圾收集器以及当前回收的内存区域不同,还可以有其他对象“临时性”地加入,共同构成完整GC Roots集合。比如:分代收集和局部回收(PartialGC)。原创 2025-02-10 13:55:23 · 923 阅读 · 0 评论 -
2.类加载子系统
完整图如下如果自己想手写一个Java虚拟机的话,主要考虑哪些结构呢?类加载器执行引擎在Java的日常应用程序开发中,类的加载几乎是由上述3种类加载器相互配合执行的,在必要时,我们还可以自定义类加载器,来定制类的加载方式。为什么要自定义类加载器?隔离加载类修改类加载的方式扩展加载源防止源码泄漏开发人员可以通过继承抽象类ava.1ang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求。原创 2025-02-05 11:12:00 · 1038 阅读 · 0 评论 -
1.JVM与Java体系结构
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。时至今日,尽管嵌入式平台已经不是Java程序的主流运行平台了(准确来说应该是HotSpotVM的宿主环境已经不局限于嵌入式平台了),那么为什么不将架构更换为基于寄存器的架构呢?具体JVM的内存结构,其实取决于其实现,不同厂商的JVM,或者同一厂商发布的不同版本,都有可能存在一定差异。原创 2025-02-05 10:54:08 · 1149 阅读 · 0 评论