本地搭建网站wordpress视频主题吾爱破解

张小明 2025/12/27 11:44:18
本地搭建网站,wordpress视频主题吾爱破解,福州,网页设计橙色代码目录 前言 一、什么是JAVA虚拟机#xff08;JVM#xff09; 二、内存结构 1.程序计数器 2.虚拟机栈 3.本地方法栈 4.堆 5.方法区#xff08;元数据区#xff09; 6、执行引擎 7、直接内存 三、垃圾回收 1.如何判断对象可以回收#xff0c; 2.垃圾回收算法 3…目录前言一、什么是JAVA虚拟机JVM二、内存结构1.程序计数器2.虚拟机栈3.本地方法栈4.堆5.方法区元数据区6、执行引擎7、直接内存三、垃圾回收1.如何判断对象可以回收2.垃圾回收算法3.分代垃圾回收4.垃圾回收器四、垃圾回收调优五、类加载器子系统1.类加载过程2.类加载器以及之间的关系3.双亲委派机制4.沙箱安全机制六、Class文件格式ClassFileFormat1.字节码文件的跨平台性2.虚拟机基石总结前言**本文以HotSpot虚拟机为代表****重点是介绍一下java虚拟机内存结构垃圾回收机制类加载子系统。**一、什么是JAVA虚拟机JVM虚拟机是一种抽象化的计算机通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构如处理器、堆栈、寄存器等还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息使得Java程序只需生成在Java虚拟机上运行的目标代码字节码就可以在多种平台上不加修改地运行。简单来说JVM是用来解析和运行Java程序的。二、内存结构JVM的内部体系结构分为三部分分别是类装载器ClassLoader子系统运行时数据区和执行引擎java虚拟机定义了若干的程序运行期间会使用到的运行时数据区其中会有一些随着虚拟机启动而启动随着虚拟机的退出而销毁比如线程独享的存储区域。线程共享堆堆外内存(元空间)线程独享 计数器本地方法栈虚拟机栈。1.程序计数器pc程序计数器存储指向下一条指令的地址由执行引擎读取下一条指令线程私有运行速度最快的存储区域他是唯一一个没有一个内存溢出out of memery的区域如果线程正在执行的是java虚拟机栈的方法时程序计数器记录的是java虚拟机 正在执行字节码指令地址如果执行的native方法则记录的是Underfined。2.虚拟机栈虚拟机栈 线程运行需要的内存空间每个方法在执行时都会创建一个栈帧栈帧每个方法运行时需要的内存一个栈内有多个栈帧。栈帧存储局部变量表动态链接操作数方法出口等信息。一个方法从调用到结束就是一个栈帧从入栈到出栈的过程。局部变量表是用来存储我们临时8个基本数据类型、对象引用地址、returnAddress类型就是一些操作完以后的数据它是一个数组结构。returnAddress中保存的是return后要执行的字节码的指令地址。操作数栈操作数栈就是用来操作的例如代码中有个 i 6*6他在一开始的时候就会进行操作读取我们的代码进行计算后再放入局部变量表中去临时来存放数据。动态链接假如我方法中有个 service.add()方法要链接到别的方法中去这就是动态链接存储链接的地方。出口出口正常的话就是return 不正常的话就是抛出异常落1.垃圾回收是否涉及栈内存答 不需要这里是一定不能有垃圾的如果这里有垃圾那么栈帧会弹不出去整个虚拟机栈会卡死。2.栈内存分配越大越好吗答 不是因为栈内存一定的情况下分配越大栈帧的数量就会减少栈内存溢出StackOverFloatError 方法的递归调用栈帧过多栈帧过大第三方的库都可能会导致 调优 -Xss3.本地方法栈java虚拟机调用本地方法时分配的内存本地方法就是一些不是由java编写的代码比如一些由c/c编写的方法本地方法栈就是给本地方法运行提供内存空间。4.堆线程共享这块是java虚拟机内存结构中最大的一块区域也是垃圾收集的主要区域线程共享主要存放java创建的实例和数组当堆中没有内存存放实例时会oom内存溢出。堆内存诊断jps查看当前系统中有哪些java进程命令行形式jmap查看堆内存的占用情况某个时刻命令行形式 jamp -heap 进程idjconsole:多功能的检测工具可以连续监测图形界面jvirsualvm:图形化界面工具可以排查堆内存占用情况堆dump。相关VM参数堆初始大小 -Xms 堆最大大小-Xmx 新生代大小 -Xmn 幸存区比例 -XX: SurvivorRatio GC详情-XX:PrintGCDetails -verbose:gc FullGC前MinorGC: -XX:ScavengeBeforeFullGC 晋升阈值-XX:MaxTenuringThreadholdthreashold5.方法区元数据区线程共享方法区逻辑上是堆的一部分方法存储了更类结构相关的一些信息比如常量类变量类的构造器方法的信息成员方法和构造方法编译器编译后的代码等等方法区如果内存不足也会报内存溢出在jdk1.8以前称为永久代在1.8以后称为元空间MateSpace不由具名管理它的内存结构而是交给操作系统内存元空间使用的系统内存元空间的串池StringTable被移到了堆内存中。代理技术在运行期间动态生成字节码可能会出现内存溢出场景 Spring mybatis。常量池存放编译期间生成字面量和符号的引用 虚拟机根据这张常量表找到要执行的方法名类名参数类型字面量等信息。运行时常量池 当常量池是在*.class 文件中的当类被加载它的常量池信息就会放入运行时常量池中并把里面的符号地址编号才能真实地址。常量池(contanst pool)和串池(String Table)的关系public class a { public static void main(String[] args){ String s1a; String s2b; //懒惰的 String s3ab; String s4 s1s2; //new StringBuilder().append().toString(),StringBuilder的 toString是new了一个新对象相当于new String(ab); String s5ab; //javac在编译期间的优化在编译就已经确定为ab System.out.println( s3 s4); //false s3是在串池中的而s4是在堆里面的地址不同 System.out.println(s3 s5); //true 这里跟上面不同之处在于 a和b是常量 而s1和s2是变量常量在编译器就已经确定不需要用StringBuilder去拼接 } }串池StringTable的特性常量池中的字符串仅仅是符号而已第一次用到才变为对象利用StringTable的机制来避免重复创建字符串对象字符串变量拼接的原理是StringBuilder创建新对象字符串常量拼接原理是编译器优化可以使用intern方法主动将串池中还没有字符串对象放入串池StringTable也会触发垃圾回收。jdk1.8这个字符串对象尝试放入串池如果有并不会放入如果没有则放入串池会把串池中的对象返回。jdk1.6将这个字符串对象尝试放入串池如果有并不会放入如果没有会把对象复制一份放入串池会把串池中的对象返回。public class a { //串池的字符[a,b,ab] public static void main(String[] args){ String s ab; String s1 new String(a) new String(b); //new String(ab); String s2 s.intern(); //将这个字符串对象尝试放入串池中如果有则不放入没有就会把串池的对象返回 System.out.println(s2 s1); //false System.out.println(s2 ab);//true } }串池的位置在jdk1.6串池StringTable是常量池中的一部分随着常量池放在永久代方法区中在jdk1.8串池StringTable是放在堆中永久代的内存回收效率很低永久代得到fullGC时才会进行垃圾回收而一个java对象中大量的字符串都放在StringTable中StringTable用的非常频繁如果放在堆中的话只需要minGC既可以触发垃圾回收6、执行引擎从代码的执行角度来讲执行引擎是非常重要的是JVM核心结构之一。JVM的主要任务是负责 装载字节码到内部但是字节码并不能直接运行在操作系统之上以因为字节码的指令并非等价于本地机器指令它的内部包含的仅仅只是一些能够被JVM所识别的字节码指令符号表。那么想让一个Java程序运行起来还需要执行引擎安静会字节码指令解释、编译成对应平台上的本地机器指令才可以。简单理解就是一个翻译官。java采用混合模式混合使用解释器 热点代码编译java的半解释半编译并不是先解释再编译的而是它可以解释也可以编译。1.解释器图中绿色部分将源代码翻译成字节码文件然后在运行时通过解释器假尼姑字节码文件翻译成机器指令时至今日Java虚拟机其实不只是面对Java这门语言因为任何class文件都能在Java虚拟机上运行。2.及时编译器 Just In-Time intepreter图中蓝色部分由于解释器在设计和实现上非常简单除了java外还有很多语言也同样是基于解释器执行基于解释器执行已经沦为低效的代名词为了解决这一问题JVM提供一种叫做及时编译器的技术。优势速度快已经可以和C/C一较高下了。既然如此为什么要保留解释器首先解释器的优点是响应速度快解释器可以马上发挥作用省去编译时间而不必等待即时编译器全部编译完成再去执行这样可以省去很多不必要的编译时间并且随之程序运行时间推移即时编译器逐渐发挥作用把越来越多的代码编译成本地代码获得更高的执行效率。热点代码检测多次被调用的方法方法计数器监测方法执行频率多次调用循环循环计数器 监测循环执行频率7、直接内存直接内存并不是java虚拟机的一部分不受JVM内存回收管理但是会内存溢出常用于NIO操作时用在数据缓冲区分配回收成本较高但是读写性能高java本身并不具备 磁盘 读写的能力java要调用磁盘文件的内容需要调用本地方法这里会牵扯到CPU的运行状态由用户转态转换到内核转态其次当CPU切换到内核状态时内存这边也会划出一块系统缓冲区中而java代码是没办法直接运行的所以会在java对内存中划分出一块java缓冲区这时会有两块缓冲区读取的时候必然会有不必要的复制降低效率。JDK1.4 中新加入了NIO(New Input/Output)类引入了一种基于通道(Channel)与缓冲区Buffer的I/O 方式它可以使用native 函数库直接分配堆外内存然后通脱一个存储在Java堆中的DirectByteBuffer 对象作为这块内存的引用进行操作。java代码能直接访问这块区域磁盘文件也能直接访问这块区域。所以就提高读写效率。直接内存和堆内存的区别直接内存的读写效率 高分配回收成本高堆内存的读写效率 低 分配回收成本低三、垃圾回收1.如何判断对象可以回收**1.1引用计数**给对象一个计数器难以解决对象之间循环引用的问题会造成内存泄漏。1.2可达性分析java虚拟机中的垃圾回收器采用的是这种算法****判断GC ROOT是否有相连的引用链如果没有就回收。1.3四种引用强度递减强引用只要沿着GCroot引用链就不能被回收。软引用只要没有被强引用引用就可能会被回收当我垃圾回收时内存不够就回收软引用本身也是一个对象当软引用对象被回收时软引用会进入引用队列。弱引用只要没有被强引用引用就可能会被回收当我垃圾回收时不管内存够不够都回收同理软引用也会进入引用队列。虚引用必须配合引用队列使用当虚引用对象创建时他会关联一个引用队列主要配合终结器引用必须配合引用队列使用2.垃圾回收算法复制算法特点效率高但是会浪费空间复制算法主要用在新生代因为大多数的对象都是朝生夕死的没办法熬过第一次的GC所以没有必要用标记算法。垃圾清除算法特点会产生空间碎片 用在老年代老年代中对象存活率较高、没有额外的空间分配对它进行担保垃圾整理算法这是复制算法和标记清除算法的折中内存利用率高而且不会产生内存碎片用在老年代。3.分代垃圾回收在谈论垃圾回收器之前我们得先了解分代模型根据对象的存活周期的不同将内存划分成几块新生代和老年代这样就可以根据各个年代的特点采用最适当的收集算法。可以用抓重点的思路来理解这个算法。新生代对象朝生夕死,对象数量多只要重点扫描这个区域那么就可以大大提高垃圾收集的效率。另外老年代对象存储久无需经常扫描老年代避免扫描导致的开销。新生代和老年代的比例是1:2新生代在新生代每次垃圾收集器都发现有大批对象死去只有少量存活采用复制算法只需要付出少量存活对象的复制成本就可以完成收集。新生代的特点所有的 new 操作分配内存都是非常廉价的TLAB thread-lcoal allocation buffer死亡对象回收零代价大部分对象用过即死朝生夕死Minor GC 所用时间远小于 Full GC新生代内存越大越好么不是新生代内存太小频繁触发 Minor GC 会 STW 会使得吞吐量下降新生代内存太大老年代内存占比有所降低会更频繁地触发 Full GC。而且触发 Minor GC 时清理新生代所花费的时间会更长老年代而老年代中因为对象存活率高、没有额外空间对它进行分配担保就必须“标记清除法或者标记整理算法进行回收。Full GC Minor GC Major GC的概念FullGC清理的是整个堆空间包括新生代和老年代SerialGCParallelGCCMS,G1折四种垃圾收集器早新生代内存不足发生的垃圾收集都是-minor gcSerial和ParallelGC在老年代内存不足发生的垃圾收集机制都是-full gcCMS和G1这两个垃圾收集在老年代有所不同对于G1来说新产生的垃圾跟不上回收的速度这时候并发收集就失败了这时候就会退化成FullGC就会特别的慢更长时间的Stop the world响应速度变慢对于CMS也一样他们工作在并发的阶段回收速度高于垃圾产生速度GC日志是不会有FullGC的字样的。MinorGCMinor GC是新生代GC指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的所以Minor GC非常频繁一般回收速度也比较快。MajorGCMajor GC是老年代GC指的是发生在老年代的GC通常执行Major GC会连着Minor GC一起执行。Major GC的速度要比Minor GC慢的多。4.垃圾回收器所谓的垃圾回收跟jdk版本有很大的关系不同版本的垃圾回收器在内存的管理是不一样的jvm的内存管理由垃圾回收器来决定。随着内存变得越来越大诞生了很多种垃圾回收器jVM总共有十种垃圾回收器这篇介绍的是前面的六种和G1前面六种是分代模型就是内存里面分成两代分为新生代和老年代G1是逻辑分代物理不分代ZGC逻辑不分代物理也不分代Shenando和ZGC他们很像Epsilon是jdk11新出的特殊的一个他什么事都没干垃圾回收器的组合凡是图中有连线的都可以组合使用但是常用的组合就三种ParNew和CMSSerial和SerialOld, ParallelScavenge和Parallelold查看虚拟机用的是那种GC的命令六种分代垃圾回收器这几个垃圾收集器一般是配合使用**1.串行**单线程适合堆内存小垃圾回收线程工作时其他线程都得停止Stop The WorldSerial工作在新生代复制算法SerialOld工作在老年代标记-整理算法**2.吞吐量优先**多线程适合堆内存比较大多核CPU支持适合服务器让单位时间内Stop The World时间变短垃圾回ParallelScavenge:新生代复制算法垃圾回收线程跟CPU核数有关ParallelOld:老年代标记整理算法这两种是JDK 1.8默认的垃圾回收机制**3.响应时间优先**多线程适合堆内存比较大多核CPU支持适合服务器尽可能让单次STW时间变短ParNew新生带复制算法serial的多线程版本CMSConcurrent Mark Sweep老年代用户线程和垃圾线程并行stop The World时间短。分为以下几个阶段1、初始标记CMS initial mark会产生停顿非常短仅仅是扫描引用链2、并发标记CMS concurrent mark从root开始找一边找业务线程一边运行3、重新标记CMS remark会产生停顿当整个图谱屡清楚以后再重新标记一边它的STW时间其实不会很短但是相比于前面几种回收器来讲时间会短很多。4、并发清除CMS concurrent sweep清除垃圾和用户线程一起工作为什么CMS不启用标记压缩要保证用户线程还能够继续执行不能改变用户线程对象的位置。优点并发收集低延迟**弊端**会产生内存碎片导致并发清除后用户线程可用空间不足无法分配大对象的情况下不得不触发Full GC。CMS对CPU的资源非常敏感在并发阶段他虽然不会导致用户线程停止但是会因为占用一大部分的线程导致应用程序变慢总吞吐量会降低。CMS收集器无法处理浮动垃圾。比如关联的对象突然变成垃圾那么他在第一次就不会被清理掉就是浮动垃圾第二次CMS才会将他们删除。另外由于垃圾收集阶段用户线程没有中断所以在CMS回收过程中还应该确保应用程序有足够可用的内存可用。因此CMS收集器不能像其他收集器那样等老年代几乎完全填满了再进行收集而是当堆内存使用率达到某一阈值时便开始使用回收以确保引用程序在CMS过程中依然有足够的空间支持程序运行。要是CMS运行期间预留的内存无法满足程序需要就会出现一次“Councurrent Mode Failure” 失败这时虚拟机将启动后备预案临时启用Serial Old收集器来重新进行老年代的垃圾收集这样停顿时间就很长了。-XX:UseConcMarkSreepGC //手动使用ParNew CMS -XX:CMSInitiatingOccupanyFraction //设置堆内存使用率的阈值 -XX:UseCMSCompactAtFullCollection //执行完full gc后进行压缩整理 -XX:CMSFullGCsBeforeCompaction //设置执行多少次不压缩的Full GC后来一次压缩整理 -XX:ParallelCMSThreads //cms线程数5、G1垃圾回收器从JDK9就默认使用使用场景同时注重吞吐量和低延迟默认的暂停目标是200msG1跟cms一样都是并发在小的堆内存场景下他们的速度暂停速度都差不多但是在堆内存大的情况下G1收集器在暂停时间的优势就体现出来了应用场景可以面向服务端应用。设计思想它将整个堆分成若干个预先设定的小区域块1~32MB大小可调每个区域内部不在进行新旧分区而是将超大堆内存管理的思想会划分为多个大小相等的区域每个区域都可以作为伊甸园老年区整体是 标记整理算法两个区域之间是复制算法。C1回收器的垃圾回收阶段YoungConnection主要是对Eden区的GC对象创建式分配到伊甸园区Eden区的内存紧张了对象多了就会以复制的算法到复制到幸存区再工作一段时间幸存区的空间不够了Eden区中的部分数据会之间晋升到老年代空间中当最终Eden空间的数据为空GC停止工作应用线程继续执行。MixedConnection混合收集在新生代和老年代都来进行规模较大的收集当整个堆大小在具名堆栈空间中占比达到45%时G1就会启动一次混合垃圾收集周期同时也回收后台扫描标记的老年代分区三色标记算法RemarkCMS和G1在并发标记时使用的是同一个算法三色标记法使用白灰黑三种颜色标记对象。白色是未标记灰色自身被标记引用的对象未标记黑色自身与引用对象都已标记。垃圾回收时会根据对象的颜色去回收垃圾漏标问题两个条件发生漏标问题灰色对象指向的白色对象引用消失黑色对象指向了白色对象。解决办法添加屏障跟踪黑指向白的增加incremental update增量更新关注引用的增加把黑色重新标记为灰色下次重新扫描属性。CMS采用该方法但是这个办法隐藏了严重的BUG所以CMS的remark阶段必须重头扫描一遍。记录灰指向白的消失SATB snapshot at the beginning关注引用的删除当灰–白消失时要把这个引用推到GC的堆栈保证白还能被GC扫描到。G1采用该方法。-XX:UseG1GC //jdk9之前手动指定 -XX:G1HeapRegionSize //指定region大小根据最小的堆内存划分成2048个区域 -XX:MaxGCPauseMillis //期望达到的最大gc停顿时间过小单次gc的对象少过大停顿时间长 -XX:InitiatingHeapOccupancyPercent //当整个Java堆的占用率达到参数值时开始并发标记阶段 -XX:ParallelGCThread //并行时gc线程数会stop-the-world -XX:ConcGCThreads //并发时gc线程数对象分配策略java某些特定小的对象是可以在java虚拟机栈进行分配栈里面通常会有方法的调用一个方法对应一个栈帧如果用栈帧来管理对象会有什么好处呢 不需要GC参与垃圾回收栈往外面一弹整个对象分配结束效率非常高。既然如此那么为什么所有的对象都不往栈上分配1.栈的空间通常比较小2.如果一个栈帧里面有个一个引用引用了另一个对象这时如果这个对象被弹出去了那么这个引用就会空指针错误。如果这个对象够大这个大是可以自己分配的栈上分配不下直接分配到老年代如果这个对象不大不小的话就会分配到伊甸园区不过前面还有一个线程本地分配缓冲区不过这块区域本身就在伊甸园区这块区域也能调优。线程本地分配缓冲区每个线程启动时jVM下每个Eden去中为本地区分配缓冲区这块区域是这个线程专属的他的目的为了使对象尽可能快的而分配出来。如果独享在一个共享空间中分配我们需要采用一些同步机制来管理这些空间内的空闲指针。在Eden空间中每一个线程都有一个固定的分区用于分配对象即一个TLAB。分配对象时线程之间不需要进行任何同步这样他们的效率又变高了。不管TLAB空间中能不能分配的对象对象都会在Eden空间中进行分配。如果Eden空间无法容纳该对象就这能在老年代中进行空间分配。四、垃圾回收调优JVM垃圾回收调优主要就是调整下面两个指标停顿时间: 垃圾收集器的垃圾回收线程中断应用执行的时间。-XXMaxGCPauseMillils吞吐量花在垃圾收集的时间和花在应用时间的占比 -XXGCTimeRatio内存占用: Java堆中所占内存的大小GC调优思路吞吐量大降低gc频率延长单次暂停时间来进行gc暂停时间短优先缩短单次暂停时间进行gc提高工程频率吞吐量下降配置常见的四种GC1.SerialGC -XXUseSerialGC #old和Young区都是用Serial2.ParallelGC -XXUseParallelGCYoung区使用Parallel scavenge回收算法old区使用Parallel 回收算法参数-XX: UseParallelOldGC来控制3.CMS -XXUseConcMarkSweepGC4.G1: -XX:UseG1GC #没有young/old区五、类加载器子系统1.类加载过程程序使用某个类时如果该类还未被加载到内存中则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。如果没有意外JVM将会连续完成3个步骤所以有时也把这个3个步骤统称为类加载或类初始化。获取类的信息使他们分配到运行时区中类加载器负责class文件的加载至于它能否运行由执行引擎决定类加载子系统负责从文件或者网络中加载Class文件Class文件打来有特定的文件标识加载加载指的是将类的class文件读入到内存class文件本来是一个个二进制字节把他们装到内存中去并将这些静态数据转换成方法区中的运行时数据结构并在堆中生成一个代表这个类的java.lang.Class对象作为方法区类数据的访问入口这个过程需要类加载器参与。Java类加载器由JVM提供是所有程序运行的基础JVM提供的这些类加载器通常被称为系统类加载器。除此之外开发者可以通过继承ClassLoader基类来自定义自己的类加载器。类加载器可以从不同来源加载类的二进制数据比如本地Class文件、Jar包Class文件、网络Class文件等等等。类加载的最终产物就是位于堆中的Class对象注意不是目标类对象该对象封装了类在方法区中的数据结构并且向用户提供了访问方法区数据结构的接口即Java反射的接口。链接 验证—准备—解析当类被加载之后系统为之生成一个对应的Class对象接着将会进入连接阶段连接阶段负责把类的二进制数据合并到JRE中意思就是将java类的二进制代码合并到JVM的运行状态之中。类连接又可分为如下3个阶段。验证确保加载的类信息符合JVM规范没有安全方面的问题。主要验证是否符合Class文件格式规范并且是否能被当前的虚拟机加载处理。准备正式为类变量static变量分配内存并设置类变量默认值的阶段这些内存都将在方法区中进行分配解析虚拟机常量池的符号引用替换为字节引用过程初始化为类的静态变量赋予初始值2.类加载器以及之间的关系jvm中所有的class都是被类加载器加载到内存的一个class文件被加载到内存中内存中其实创建了两个内容第一块内容确实是这个class文件被加载到内存中第二块内容是生成了一个Class类的对象ClassClass类的对象指向这个 class文件内容。启动类加载器由C实现没有父类加载 lib 下或被 -Xbootclasspath 路径下的类。拓展类加载器(ExtClassLoader)由Java语言实现父类加载器为null加载扩展jar包 lib/ext 或者由 java.ext.dirs 系统变量所指定的路径下的类系统类加载器(AppClassLoader)由Java语言实现父类加载器为ExtClassLoader加载classpath指定的内容自定义类加载器父类加载器为AppClassLoader。3.双亲委派机制java虚拟机对class文件采用按需加载如果一个类加载器收到一个类加载请求他会先委托给父类去加载一步一步向上委托直到启动类加载器父类无法加载时子类才会尝试去加载优点 避免类的重复加载保护程序的安全防止程序的api被加载。Java类随着它的类加载器一起具备了一种带有优先级的层次关系通过这种层级关可以避免类的重复加载当父亲已经加载了该类时就没有必要子ClassLoader再加载一次。其次是考虑到安全因素java核心api中定义类型不会被随意替换假设通过网络传递一个名为java.lang.Integer的类通过双亲委托模式传递到启动类加载器而启动类加载器在核心Java API发现这个名字的类发现该类已被加载并不会重新加载网络传递的过来的java.lang.Integer而直接返回已加载过的Integer.class这样便可以防止核心API库被随意篡改。4.沙箱安全机制保证程序安全保护Java原生JDKJava安全模型的核心就是Java沙箱sandbox。什么是沙箱沙箱就是一个限制程序运行的环境。沙箱机制就是将Java代码限制在JVM特定的运行范围中防止对本地系统的破坏。沙箱主要 限制系统资源的访问系统资源包括CPU 内存文件系统网络不同级别的沙箱最这些资源的访问限制也不一样。所有的Java运行环境都可以指定沙箱可以指定沙箱策略。六、Class文件格式ClassFileFormat1.字节码文件的跨平台性1.Java语言 跨平台语言当java源代码成功编译成字节码后如果想在不同的平台上面运行则无需再次编译跨平台似乎已成为一门语言必选的特征2.Java虚拟机跨平台的语言Java虚拟机不包括Java在内的任何语言绑定他只和“Class”文件这种特定的二进制文件所关联无论实用任何语言进行软件开发只要是能将源文件编译成正确的Class文件那么这种语言就可以在Java虚拟机上执行可以说统一额而强大的Class文件结构就是Java虚拟机的即使和桥梁java语言每次在发布新版本时都会发布java规范和java虚拟机规范3.如果想让Java虚拟机正确运行在JVM中Java源码就必须编译成符合规范的字节码文件Java的前端编译器的主要任务就是负责这个任务的javac是一种能够将Java源码编译成字节码的前端编译器。javac编译器编译经历四个步骤词法解析语法解析语义解析生成字节码前端编译器并不是JVM中的一部分在Hotspot 虚拟机中并没有强制要求只能使用javac编译器处理javac之外java虚拟机该有内置在Eclipse中的ECJ编译器和javac全量式编译不同的是ECJ使用的是增量式编译器。前端编译器并不直接涉及到编译优化的技术而是将具体的优化细节交给HotSpot的后盾编译器JIT编译器负责2.虚拟机基石字节码文件面是什么源代码经过前端编译器会生成字节码文件字节码文件就是一种二进制的类文件它的内容是JVM的指令而不是像C/C那样经过编译器直接生成机器码。什么是字节指令Java虚拟机的指令是由一个字节长度代表着某种特定操作含义的操作码以及跟随其后的零至多个代表此操作所需参数的操作数所构成虚拟机中许多指令并不包含操作数是有一个操作码如何解读字节码文件在idea中安装一个jclasslib插件就可以查看字节码文件字节码文件结构Class类的本质任何class文件都对应着唯一的一个类或者接口的定义信息但反过来说Class文件实际上并不一定是一磁盘文件的形式存在Class文件是一组以8位字节为基础的二进制流。Class文件格式class文件采用一种类似于c语言结构体的方式进行数据存储这种结果中只有两种数据类型符号和表。无符号数属于基本的数据类型以u1、u2、u4、u8来表示1个字节、2个字节、4个字节和8个字节的无符号数无符号数可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成的字符串值。表是由多个无符号数或者其他表作为数据项构成的符合数据类型所有表都习惯性地以“_info”结尾。表用于描述有层次关系的复合结构的数据整个Class文件本质上就是一张表它由下表所示的数据项构成。语法糖所谓的语法糖 其实就是指 java 编译器把*.java源码编译为*.class字节码的过程中自动生成和转换的一些代码主要是为了减轻程序员的负担算是 java 编译器给我们的一个额外福利。1.自动拆装箱这个功能是jdk5加入的将基本数据类型装换成包装类型就是装箱将包装类型转换成基本数据类型就是拆箱这些操作都是编译器在编译期间生成字节码里面就包含拆装箱代码。2.默认构造在java文件当中进行编写一个不提供构造方法在进行编译的时候会自动加上一个默认无参构造方法。3.泛型集合取值泛型也是jdk5以后添加的特性但是在java编译泛型代码后会执行泛型擦除的动作即泛型信息在编译为字节码 文件之后就丢失了实际上的类型都当做 Object来处理。简单来讲就是泛型类型在编译成字节码文件后已经不区分是IntrgerString还是其他类型统一当成是Object泛型信息在这个时候丢掉了。4.可变参数也是jdk5引入的新特性String …args其实就是一个String [] args5.foreach循环还有一些重点不展开介绍总结看完课程再写完博客后感觉对JVM的理解变深了很多虽然这篇文章的深度不够有错误多点评后面会修正。说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。结果GPT、DeepSeek火了之后整条线上的人都开始有点慌了大家都在想“我是不是要学大模型不然这饭碗还能保多久”先给出最直接的答案一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

广州优化网站排名不备案的网站能打开吗

第一章:Open-AutoGLM金融应用安全规范概述在金融领域,人工智能模型的部署必须遵循严格的安全与合规标准。Open-AutoGLM 作为面向金融场景的自动化语言模型框架,其设计核心之一便是内置多层次安全机制,确保数据隐私、模型可解释性及…

张小明 2025/12/27 11:44:17 网站建设

石景山重庆网站建设中国建筑100强企业名单

在糖生物学与神经科学交叉的前沿领域,糖链结构作为细胞表面重要的信息载体,参与调控细胞识别、信号转导、免疫应答等一系列关键生命过程。其中,神经节苷脂GM1是细胞膜上一种重要的糖鞘脂,其寡糖链部分在维持神经系统功能、介导病原…

张小明 2025/12/27 11:43:44 网站建设

小蘑菇网站建设下载旅游网站设计思路及设计过程

Puppet自定义类型、报告处理程序和Faces的深入解析 1. Puppet自定义类型和提供者 Puppet在系统资源管理方面表现出色,其类型和提供者提供的抽象层让我们无需关注不同操作系统上资源的具体实现。这是Puppet强大的竞争优势,而且还可以轻松创建自定义类型和提供者,并无缝分发…

张小明 2025/12/27 11:43:12 网站建设

云南网站建设天度培训心得体会800字

LSPlant安卓Hook框架实战指南:轻松实现Java方法拦截 【免费下载链接】LSPlant A hook framework for Android Runtime (ART) 项目地址: https://gitcode.com/gh_mirrors/ls/LSPlant LSPlant作为一款专为Android ART运行时设计的Hook框架,为开发者…

张小明 2025/12/27 11:42:39 网站建设

电商网站设计是干什么的网站 改域名

Quasar终极网络传输架构重构:从协议栈到数据平面的革命性革新 【免费下载链接】Quasar Remote Administration Tool for Windows 项目地址: https://gitcode.com/gh_mirrors/qua/Quasar 在远程管理工具领域,网络传输架构长期受限于传统的TCP/IP协…

张小明 2025/12/27 11:42:07 网站建设

贵阳网站建设管理东莞app制作公司

2025.12.18 论文阅读一、文献阅读题目信息摘要创新点理论基础量子比特与纠缠量子求解器实验非线性方程积分与副本数验证与经典系综预测的对比结论不足与展望一、文献阅读 题目信息 题目: 《Quantum Computers for Weather and Climate Prediction: The Good, the …

张小明 2025/12/27 11:41:34 网站建设