96SEO 2026-02-20 05:11 0
。

JVM的设计使得Java具有跨平台性#xff0c;开发人员只需编写一次代码#xff0c;就可以在任何支持Java的系统上运行。
我们刚开始学习Ja…Java虚拟机JVM是Java程序运行的核心组件它负责解释执行Java字节码并在各种平台上执行。
JVM的设计使得Java具有跨平台性开发人员只需编写一次代码就可以在任何支持Java的系统上运行。
我们刚开始学习Java时就下载了JDKJava开发工具包它提供了编译、调试和运行Java应用程序所需的工具和库。
JDK包括了JREJava运行时环境JRE包含了Java虚拟机JVM。
由于不同的CPU的指令集可能不同所以相同的代码可能不能在不同的系统上都正常运行而JVM就是为了解决这个问题Java会先通过javac把
java字节码相当于Java自己的一套CPU指令然后再由具体系统平台上的的JVM不同系统上的JVM可能存在差异把上述字节码转化为对应的CPU能识别的机器指令。
JVM其实也是一个进程任务管理器中看到的java进程Java程序的执行时申请的内存就是JVM从系统这边申请到的内存JVM会先申请一块大的内存这块内存在给Java程序使用时又会根据实际的用图划分出不同的区域每个区域都有不同的作用。
Java堆是Java虚拟机管理的最大一块内存区域用于存放对象实例数组类的成员变量。
Java堆是所有线程共享的内存区域是垃圾回收的重点区域。
Java虚拟机栈也称为栈内存用于存储线程的方法调用、局部变量、部分结果等。
每个方法在被调用时都会创建一个栈帧并入栈方法执行完毕后栈帧出栈。
栈帧包括局部变量表、操作数栈、动态链接、方法返回地址等。
本地方法栈类似于Java虚拟机栈但是它为Native方法服务即JVM内部使用C、C等编写的本地方法。
程序计数器是一块较小的内存区域用于记录当前线程下一条执行的字节码指令地址。
在多线程环境下每个线程都有独立的程序计数器。
Area元数据指的是一些辅助性质的描述性质的属性元数据区主要用于存储类的元数据信息例如类的结构、方法信息、字段信息等。
一个程序有哪些类每个类中有哪些方法每个方法里要包含哪些指令都会记录在元数据区中即元数据区储存了Java代码编译后的Java字节码
注意一个JVM进程中堆和元数据区只有一个栈和程序计数器可能有多份每个线程都有一个自己的程序计数器和栈即每个线程都有自己的执行流。
m;//static修饰的变量为类属性储存在元数据区public
JVM的类加载机制是指JVM在运行时将类的字节码加载到内存中并进行验证、准备、解析和初始化的过程。
JVM的类加载机制主要包括以下几个步骤
加载Loading查找并加载类的字节码文件。
这个过程可以通过类加载器来完成类加载器会根据类的全限定名在文件系统、网络或其他地方找到对应的字节码文件并将其读入内存。
验证Verification确保被加载的类的字节码是合法、符合JVM规范的。
包括文件格式验证、元数据验证、字节码验证、符号引用验证等步骤。
具体验证依据在Java虚拟机规范中有明确的格式说明
准备Preparation为类的静态变量分配内存并设置默认初始值这些变量所使用的内存都将在方法区中进行分配。
解析Resolution将类中的符号引用转换为直接引用这个过程可以在运行时进行也可以在编译时进行。
上面代码编译后hello会储存在常量池中s中相当于保存了“hello的字符串常量的地址但是代码没有运行时s和hello都在字节码文件中文件中没有地址这样的概念所以在代码运行前s中存储的是一个类似于”偏移量的概念记录了“hello”的相对位置就是这里的符号引用。
初始化Initialization对类进行初始化包括执行类构造器clinit()方法静态变量赋值等操作。
在初始化阶段JVM会根据程序中对类的主动使用情况来触发初始化例如创建类的实例、访问类的静态成员、调用类的静态方法等。
在类加载过程中JVM采用了双亲委派模型即由多个不同层次的类加载器组成一个层次结构每个类加载器都有自己的责任范围当一个类需要加载时先由最顶层的类加载器尝试加载如果无法加载再交由下一层的类加载器依次类推直到最底层的类加载器。
JVM中进行类加载是由一个专门的模块“类加载器ClassLoader”完成的类加载器的作用是通过“全限定类名”带有包名的类名例如java.land.String可以类比为文件路径中的绝对路径查找
.class文件的数据转化为运行时需要的类对象并加载到JVM中。
ClassLoader负责加载Java的核心类库如java.lang包下的类。
它是JVM自身的一部分通常由C编写并不继承自java.lang.ClassLoader类。
ClassLoader负责加载Java的扩展类库位于jre/lib/ext以及第三方库的目录。
除了这三个默认的类加载器开发者也可以自定义类加载器来实现特定的类加载需求比如从网络中动态加载类、加密类加载等。
自定义类加载器需要继承自java.lang.ClassLoader类并重写其中的findClass()方法来实现类的加载逻辑。
注意这三个类加载器之间存在父子关系上面的为父加载器下面的为子加载器即1是2的父亲2是3的父亲。
双亲委派流程当一个类加载器收到类加载请求时它首先将这个请求委托给它的父类加载器处理。
如果父类加载器无法完成此加载请求子加载器才会尝试自己去加载。
这个过程会一直递归下去直到启动类加载器。
这样做的目的是保证Java核心API的稳定性防止用户自定义的类替换掉核心类库中的类。
ClassLoader不会立刻搜索自己负责的目录会把任务交给父类加载器Extension
ClassLoader也不会立刻搜索自己负责的目录也会把任务交给父类加载器Bootstrap
ClassLoader没有父类加载器就会搜索自己负责的目录查找需要的
.class文件如果找到了就直接进入打开文件/读文件等流程中如果没找到则把任务交给下一级类加载器Extension
接受到任务此时就会在自己负责的目录中开始寻找如果找到了就直接进入打开文件/读文件等流程中如果没找到则同样把任务交给下一级类加载器Application
也会在自己负责的目录中开始寻找如果找到了就直接进入打开文件/读文件等流程中如果没找到也会尝试把任务交给下一级但是默认情况下Application
ClassLoader没有下一级类加载器了于是就会类加载失败抛出ClassNotFoundException异常
上述流程就保证了类加载的顺序防止用户自定义的类替换掉核心类库中的类。
例如用户自己定义了一个java.lang.String如果这个类先被加载了java核心库中的String类就不会被加载。
垃圾回收GC是自动内存管理的关键技术之一。
它负责清理不再使用的对象释放内存空间。
垃圾回收回收的是堆的内存
判定对象后续是否会继续使用不会继续使用的就会被视为垃圾如果一个对象没有任何引用指向它那么这个对象就无法被继续使用了也就会被视为垃圾。
引用计数方法并没有在JVM中使用但是广泛运用在其他主流语言的垃圾回收机制中如PythonPHP。
引用计数是通过给每个对象安排一个额外的空间记录当前有几个引用指向该对象。
每有一个引用指向该对象时就把值加一反之则减一当这个值为0时则视为垃圾当负责垃圾回收的扫描线程获取到这个对象的引用计数情况时发现为0就会释放这个对象的空间。
问题一要给每个对象安排计数器就会消耗额外的空间如果对象数量很多总的空间浪费也就很多。
问题二可能产生循环引用问题例如两个对象互相引用但没有一个外部的引用指向它们此时这两个对象是无法被获取到的但他们的引用计数又不为0也就不会被释放。
遍历所有变量JVM会遍历所有能够被直接或者间接访问到的对象能访问到的自然不是垃圾遍历一圈后不能访问到的就视为垃圾。
如图所示释放后会导致出现很多大大小小的内存碎片而内存申请都是一次申请一段连续的内存空间这就导致了部分内存碎片可能无法使用到也就导致了空间浪费。
将内存分为两个相等的部分每次只使用其中一半。
当这一半的内存用完后就将还在使用的对象复制到另一半然后再清除掉已经使用过的那一半内存中的所有对象。
这种方法避免了内存碎片但是总的可用空间变少了同时复制对象也会消耗时间。
JVM中采用的是分代回收算法。
给每个对象引入年龄的概念JVM中存在专门的线程负责周期性的扫描/释放对象如果一个对象被线程扫描了一次并且不是垃圾该对象的年龄就会1初始年龄为0。
JVM中会根据对象年龄的差异把整个内存分成两个大的部分新生代年龄较小的对象/
老年代年龄较大的对象新生代又被划分为三个区域其中大的一部分区域为
新的对象都是从伊甸区中被创建的第一轮GC扫描后没有被清除的对象就会被通过复制算法移动到生存区即生存区相当于未被使用的那块内存生存区中的对象下次被GC扫描后存活的对象又会被通过复制算法移动到另一个生存区注意两个生存区完全是对等的每经历一次GC对象的年龄就会1如果某个对象在生存区中经过了若干轮GC任然没有被清除JVM就会认为这个对象的生命周期很长就会把这个对象移动到老年代老年代的对象也会被GC扫描只不过扫描的频率较低。
老年代的对象被视为垃圾时会按照标记-整理算法释放内存。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback