给别人建设网站怎么收费,wordpress首页怎么打开很慢,wordpress 常用代码,wordpress加载动画JVMJava程序#xff0c;是一个名字为Java 的进程#xff0c;这个进程就是所说的“JVM”1.内存区域划分JVM会先从操作系统这里申请一块内存空间#xff0c;在这个基础上再把这个内存空间划分为几个小的区域在一个JVM进程中#xff0c;堆和方法区只有一份#xff1b;栈和程序…JVMJava程序是一个名字为Java 的进程这个进程就是所说的“JVM”1.内存区域划分JVM会先从操作系统这里申请一块内存空间在这个基础上再把这个内存空间划分为几个小的区域在一个JVM进程中堆和方法区只有一份栈和程序计数器每个线程有一份1.堆存放new的对象堆里面分为两个区域新生代和老年代新生代放新建的对象当经过一定GC次数之后还存活的对象会放入老年代。新生代还有三个区域一个 Endn 两个 SurvivorS0/S1垃圾回收的时候会将 Endn 中存货的对象放到一个未使用的Survivor 中并把当前的 Endn 和正在使用的 Survivior 清除掉2.栈存放方法之间的调度关系虚拟机栈java里面用来保存调用关系的内存空间本地方法栈本地方法就是JVM内部 C 写的代码调用关系的内存空间3.程序计数器存放下一个要执行的指令的地址程序计数器是一块比较小的内存空间可以看作释放前线程所执行的字节码的行号指示器4.方法区存放类对象加载好的方法区的作用用来存储被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据的变量在哪个部分和变量类型无关和变量的形态有关成员静态局部代码里的局部变量栈代码里的成员变量堆代码里的静态变量方法区2.类加载java程序在运行之前需要先编译 .java .class二进制字节码文件运行的时候Java 进程JVM就会读取对应的 .class 文件并且解析内容在内存中构造出类对象并进行初始化1.类加载过程其中前5步时固定的顺序并且也是类加载的过程其中中间的3步都属于连接所以类加载总共分为现在几个步骤加载找到.class文件读取文件内容并且按照.class规范格式来解析验证检查看当前的.class里的内容格式是否符合要求准备给类里的静态变量分配内存空间解析初始化字符串常量把符号引用替换成直接引用在类加载之前字符串常量是没有分配内存空间的变量名称无法保存字符串常量的真实地址只能先使用一个占位符等类加载完成字符串常量分配过内存之后就可以用真正的地址替换占位符初始化针对类进行初始化初始化静态成员执行静态代码块并且加载父类2.何时触发类加载使用到一个类的时候就触发加载类并不一定是程序一启动就加载了而是第一次使用才加载创建这个类的实例使用了这个类的静态方法/静态属性使用类的子类(加载子类就会触发加载父类)3.双亲委派模型如果一个类加载器收到了类加载的请求它首先不会自己尝试去加载而是将这个请求委派给父类加载器去完成每一个层次的类加载器都是如此因此所有的加载请求最终都应该传送到最顶层的启动类加载器中只有当父加载器反馈自己无法完成这个加载请求时子加载器才会尝试自己去完成加载类加载器JVM加载类是由类加载器(class loader)模块来负责的JVM 自带了多个类加载器Bootstrap ClassLoader 负责加载标准库中的类Extension ClassLoader 负责加载 JVM 扩展的库的类Application ClassLoader 负责加载自己的项目里的自定义类双亲委派模型的工作过程上述三个类加载器存在父子关系进行类加载的时候输入的内容全限定类名形如java.lang.Thread加载的时候从Application ClassLoader开始某个类加载器开始加载到时候不会立即扫描自己的路径而是先把任务委派给父“类加载器”找到最上面的 Bootstrap ClassLoader在往上没有父“类加载器”了就会自己加载如果父”类加载器“没有找到类就会交给自己的子”类加载器“继续加载如果一直找到最下面的Application ClassLoader 也没有找到类就会抛出一个“类没找到”异常类加载就失败了3.垃圾回收GCJava堆中存放着几乎所有的对象实例垃圾回收器在对堆进行垃圾回收前首先要判断这些对象哪些还被引用着哪些已经没有引用了。判断对象是否被引用有如下几种算法内存VS对象在Java中所有的对象都是要存在内存中的因此将内存回收也叫做死亡对象的回收。1.GC回收的部分JVM主要内存分成这几个部分堆GC主要针对堆来回收方法区类对象加载之后也不太会卸载栈释放时机确定不必回收程序计数器固定内存空间不必回收2.回收对象的判断算法1.引用计数算法给每个对象都加上一个计数器这个计数器就表示“当前的对象几个引用”但是主流的 JVM 中没有选用引用计数法来管理内存最主要的原因就是引用计数法无法解决对象循环引用问题循环引用当两个对象互相引用时classTest{ Testx;}TestanewTest();TestbnewTest();a.xb;b.xa;anull;bnull;当前这两个对象的计数器都为1所以无法进行释放此时外界的代码仍然时无法访问和使用对象的2.可达性分析【JVM采取的方法】核心思想通过一系列称为 “GC Roots” 的对象作为起始点从这些节点开始向下搜索搜索走过的路径称之为 “引用链”当一个对象到GC Roots没有任何的引用链时证明此对象是不可用的对象 Object 5-Object 7 之间虽然还有关联但是它们到达不了GC Roots 是不可达的因此他们会被判定为可回收对象在Java语言中课作为GC Roots的对象包含下面几种虚拟机栈栈帧中的本地变量表中引用的对象方法区中类静态属性引用的对象方法区中常量引用的对象本地方法栈中JNINative引用的对象3.垃圾回收算法1.标记-清除算法首先标记出垃圾然后直接把对象对应的内存空间进行释放标记-清楚算法的不足效率问题标记和清楚这两个过程的效率都不高空间问题标记清楚后会产生大量不连续的内存碎片内存碎片较多会导致在分配内存空间较大的对象时无法找到足够连续的内存2.复制算法复制算法是为了解决“标记-清楚”算法带来的问题描述将一个内存空间分为两部分首先先使用一边清理时不再是原地释放而是把“非垃圾”拷贝了另一边然后再把之前这一边给释放掉复制算法的不足空间利用率更低了一次只能使用一半的内存空间如果一轮GC下来大部分对象仍然需要保留只有少数对象要回收这个时候拷贝开销就很大3.标记-整理算法前面与“标记-清理”算法过程一致打包后续不是直接堆可回收对象进行清理而是让所有存活对象都想一段移动然后直接清理掉边界以外的内存类似于顺序表的删除元素操作这种方式相对于上述的复制算法来说空间利用率上来了同时能够解决内存碎片问题但是搬运操作也是比较耗时的4.分代回收算法分代算法是通过区域划分实现不同区域和不同的垃圾回收策略从而实现更好的垃圾回收当前 JVM 垃圾收集采用此算法一般是将Java堆分为新生代GC 扫描的频率更高和老年代GC 扫描的频率降低在新生代中每次垃圾回收都有大批对象死去只有少量存活因此我们采用复制算法而老年代中对象存活率高没有额外空间对它进行分配担保就必须采用“标记-清除”或者“标记-整理”算法根据对象的不同特点根据对象的年龄依据 GC 的轮次来算的有一组线程周期性的扫描代码里所有的对象如果一个对象经历了一次GC ,就认为年龄1来划分。一个基本的经验规律如果一个对象的寿命比较长大概率还会活很久上述规则还有个特殊情况如果对象是一个非常大的对象将会直接进入老年代