最大网站建设公司排名wordpress登录400错误

当前位置: 首页 > news >正文

最大网站建设公司排名,wordpress登录400错误,济南1951年建站,网上商店建设前准备一、介绍 1.什么是JVM? JVM是一种用于计算设备的规范#xff0c;它是一个虚构出来的机器#xff0c;是通过在实际的计算机上仿真模拟各种功能实现的。JVM包含一套字节码指令集#xff0c;一组寄存器#xff0c;一个栈#xff0c;一个垃圾回收堆和一个存储方法域。JVM屏…一、介绍 1.什么是JVM? JVM是一种用于计算设备的规范它是一个虚构出来的机器是通过在实际的计算机上仿真模拟各种功能实现的。JVM包含一套字节码指令集一组寄存器一个栈一个垃圾回收堆和一个存储方法域。JVM屏蔽了与具体操作系统平台相关的信息使Java程序只需生成在Java虚拟机上运行的目标代码字节码,就可以在多种平台上不加修改地运行。 JVM在执行字节码时实际上最终还是把字节码解释成具体平台上的机器指令执行。 2.JDK、JRE、JVM是什么关系 JDK(Java Development Kit)Java 语言的软件开发工具包是开发者用来编译、调试程序用的开发包。JDK是整个java开发的核心它包含了JAVA的运行环境JVMJava系统类库和JAVA工具。JDK也是Java程序需要在JRE上运行。 JDK包含的基本组件包括 javac – 编译器将源程序转成字节码jar – 打包工具将相关的类文件打包成一个文件javadoc – 文档生成器从源码注释中提取文档jdb – debugger查错工具java – 运行编译后的java程序.class后缀的appletviewer小程序浏览器一种执行HTML文件上的Java小程序的Java浏览器。Javah产生可以调用Java过程的C过程或建立能被Java程序调用的C过程的头文件。JavapJava反汇编器显示编译类文件中的可访问功能和数据同时显示字节代码含义。Jconsole: Java进行系统调试和监控的工具 JRE(Java Runtime Environment)也就是Java平台。所有的Java程序都要在JRE环境下才能运行。 JRE包括 一个Java虚拟机Java Virtual MachineJVM一些标准的类别函数库Class Library JVM(Java Virtual Machine)是JRE的一部分。它是一个虚构出来的计算机是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 JVM有自己完善的硬件架构如处理器、堆栈、寄存器等还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关实现跨平台。 3.JVM原理 JVM是Java的核心和基础在Java编译器和OS平台之间的虚拟处理器可在上面执行字节码程序。Java编译器只要面向JVM生成JVM能理解的字节码文件。Java源文件经编译成字节码程序通过JVM将每条指令翻译成不同的机器码通过特定平台运行。 线程私有区域Java栈、本地方法栈、程序计数器线程私有区域不会有垃圾回收方法区属于特殊的堆JVM调优几乎都是调整堆 4.JVM体系结构 类加载器加载class文件运行时数据区包括方法区、堆、Java栈、程序计数器、本地方法栈执行引擎执行字节码或者执行本地方法 二、运行时数据区 方法区属于共享内存区域存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池存在方法区中。 堆Java虚拟机所管理的内存中最大的一块一个JVM只有一个堆堆的大小可以调节唯一的目的是存放对象实例。由于是垃圾收集器管理的主要区域因此有时候也被称作GC堆。 栈用于描述Java方法执行的模型。每个方法在执行的同时都会创建一个栈帧用于存储8大数据类型、对象的引用、局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用至执行完成对应于一个栈帧在虚拟机栈中从入栈到出栈。 程序计数器当前线程所执行字节码的行号指示器。每一个线程都有一个独立的程序计数器线程的阻塞、恢复、挂起等一系列操作都需要程序计数器的参与因此必须是线程私有的。 本地方法栈与虚拟机栈作用相似只不过虚拟机栈为执行Java方法服务而本地方法栈为执行Native方法服务比如在Java中调用C/C。
三、类加载机制 类加载器通过一个类的全限定名来获取描述此类的二进制文件流的代码模块。

  1. 类的生命周期(7个) 加载、验证、准备、解析、初始化、使用、卸载
  2. 类加载的五个过程 虚拟机把描述类的数据从 Class 文件加载到内存并对数据进行校验、装换解析和初始化最终形成可以被虚拟机直接使用的 Java 类型。 加载类加载器获取二进制字节流将静态存储结构转化为方法区的运行时数据结构并生成此类的Class对象即把字节码通过二进制的方式转化到方法区中的运行数据区。 验证验证文件格式、元数据、字节码、符号引用确保Class的字节流中包含的信息符合当前虚拟机的要求。 准备为类变量分配内存并设置其初始值这些变量使用的内存都将在方法区中进行分配。 解析将常量池内的符号引用替换为直接引用包括类或接口的解析、字段解析、类方法解析、接口方法解析。 初始化前面过程都是以虚拟机主导而初始化阶段开始执行类中的 Java 代码。
  3. 类加载器 启动类加载器(BootStrap ClassLoader)主要负责加载jre/lib/rt.jar相关的字节码文件的。 扩展类加载器(Extension Class Loader)主要负载加载 jre/lib/ext/*.jar 这些jar包的。 应用程序类加载器(Application Class Loader)主要负责加载用户自定义的类以及classpath环境变量所配置的jar包的。 自定义类加载器(User Class Loader)负责加载程序员指定的特殊目录下的字节码文件的。大多数情况下自定义类加载器只需要继承ClassLoader这个抽象类重写findClass()和loadClass()两个方法即可。
  4. 类加载机制双亲委派 类的加载是通过双亲委派模型来完成的双亲委派模型即为下图所示的类加载器之间的层次关系。 工作过程如果一个类加载器接收到类加载的请求它会先把这个请求委派给父加载器去完成只有当父加载器反馈自己无法完成加载请求时子加载器才会尝试自己去加载。可以得知所有的加载请求最终都会传送到启动类加载器中。
  5. JVM类初始化顺序 父类静态代码块和静态成员变量子类静态代码块和静态成员变量父类代码块和普通成员变量父类构造方法子类代码块和普成员变量子类构造方法
  6. 对象的创建过程 检查类是否已被加载没有加载就先加载类 分配内存空间使用 new 关键字在堆内存中分配一块空间使用CAS方式分配防止在为A分配内存时执行当前地址的指针还没有来得及修改对象B就拿来分配内存。 初始化对象头在分配的内存空间中Java 虚拟机会为对象头分配一定的空间用于存储对象的元数据信息如对象的类型、哈希码、GC 信息等。 执行构造方法在对象头初始化完成后Java 虚拟机会调用对象的构造方法对对象进行初始化包括成员变量的赋值、方法的调用等。 返回对象引用构造方法执行完毕后会返回对象的引用该引用可以被赋值给变量或者作为参数传递给其他方法。
  7. 对象头中有哪些信息 对象头中有两部分 一部分是MarkWork存储对象运行时的数据如对象的hashcode、GC分代年龄、GC标记、锁的状态、获取到锁的线程ID等另外一部分是表明对象所属类如果是数组还有一个部分存放数组长度。 四、垃圾回收 GCGarbage Collection垃圾收集回收垃圾释放内存。 程序计数器、虚拟机栈、本地方法栈是线程私有的所以会随着线程结束而消亡。 Java 堆和方法区是线程共享的在程序处于运行期才知道哪些对象会创建这部分内存的分配和回收都是动态的垃圾回收所关注的就是这部分内存。 GC的目的实现内存的自动释放使用可达性分析法判断对象是否可回收采用了分代回收思想将堆分为新生代、老年代新生代中采用复制算法老年代采用整理算法当新生代内存不足时会minorGC,老年代不足时会fullGC 1、判断对象已死 在进行内存回收之前要做的事情就是判断那些对象是‘死’的哪些是‘活’的。 引用计数法 给对象中添加一个引用计数器当一个地方引用了对象计数加1当引用失效计数器减1当计数器为0表示该对象已死、可回收 注意如果不下小心直接把 Obj1-reference 和 Obj2-reference 置 null。则在 Java 堆当中的两块内存依然保持着互相引用无法回收。引用计数法很难解决循环引用问题 可达性分析 通过一系列的 ‘GC Roots’ 的对象作为起始点从这些节点出发所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连的时候说明对象不可用。 可作为 GC Roots 的对象 虚拟机栈中引用的对象方法区中类静态属性引用的对象方法区中常量引用的对象本地方法栈中native方法引用的对象 引用下面四种引用强度依次减弱 强引用默认情况下对象采用的均为强引用new的对象。哪怕内存溢出也不会回收软引用SoftReference 类实现软引用。在系统要发生内存溢出异常之前将会把这些对象列进回收范围之中进行二次回收只有内存不足时才会回收。弱引用WeakReference 类实现弱引用。对象只能生存到下一次垃圾收集之前。在垃圾收集器工作时无论内存是否足够都会回收掉只被弱引用关联的对象。虚引用PhantomReference 类实现虚引用。无法通过虚引用获取一个对象的实例为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 什么情况下会内存溢出 堆内存溢出 当对象一直创建而不被回收时加载的类越来越多时虚拟机栈的线程越来越多时 栈溢出方法调用次数过多一般是递归不当造成 2、垃圾收集算法 标记清除算法先标记出所有需要回收的对象标记完成后统一回收所有被标记的对象。复制算法将可用内存分为大小相等的两块每次只使用其中一块当这一块内存用完了就将存活的对象复制到另一块最后- 将此块内存一次性清理掉。标记整理算法先标记所有需要回收的对象然后让所有存活的对象向一端移动最后直接清理掉边界以外的另一端内存。分代收集算法把Java堆分为新生代和老年代。新生代中只有少量对象会存活就选用复制算法老年代中对象存活率较高选用标记清除算法。 3、垃圾收集器 Serial收集器单线程收集器。收集垃圾时必须暂停其他所有工作线程直到它收集结束。Parnew收集器Serial收集器多线程版本。Parallel Scavenge收集器使用复制算法的新生代收集器。Serial Old收集器使用标记-整理算法的老年代单线程收集器。Parallel Old收集器使用标记-整理算法的老年代多线程收集器。CMS收集器基于标记-清除算法的低停顿并发收集器。运作步骤为①初始标记②并发标记③重新标记④并发清除。G1收集器最前沿的面向服务端应用的垃圾收集器。运作步骤为①初始标记②并发标记③最终标记④筛选回收。 CMS:收集器有以下特点 以最小的停顿时间为目标优先降低GC停顿时间相对地降低吞吐量。只运行在老年代的垃圾回收器。使用标记-清除算法可以并发收集。 G1收集器有以下特点 并行与并发无需停顿Java线程来执行GC动作。分代收集可独立管理整个GC堆。空间整合运行期间不会产生内存空间碎片。可预测的停顿除了低停顿还能建立可预测的停顿时间模型。 4、JVM内存分代机制 方法区即被称为永久代而堆中存放的是对象实例为了回收的时候对不同的对象采用不同的方法又将堆分为新生代和老年代默认情况下新生代占堆的1/3老年代占堆的2/3。 注意逻辑上存在物理上不存在 新生代Young HotSpot将新生代划分为三块一块较大的Eden伊甸园空间和两块较小的Survivor幸存空间默认比例为811。 老年代Old 在新生代中经历了多次GC后仍然存活下来的对象会进入老年代中。老年代中的对象生命周期较长存活率比较高在老年代中进行GC的频率相对而言较低而且回收的速度也比较慢。 永久代Permanent永久代存储类信息、常量、静态变量、即时编译器编译后的代码等数据对这一区域而言一般而言不会进行垃圾回收。 元空间metaspace 从JDK 8开始Java开始使用元空间取代永久代元空间并不在虚拟机中而是直接使用本地内存。那么默认情况下元空间的大小仅受本地内存限制。当然也可以对元空间的大小手动的配置。 GC 过程 新生成的对象在Eden区分配大对象除外大对象直接进入老年代当Eden区没有足够的空间进行分配时虚拟机将发起一次Minor GC。 GC开始时对象只会存在于Eden区和Survivor From区Survivor To区是空的作为保留区域。GC进行时Eden区中所有存活的对象都会被复制到Survivor To区而在Survivor From区中仍存活的对象会根据它们的年龄值决定去向年龄值达到年龄阀值默认为15新生代中的对象每熬过一轮垃圾回收年龄值就加1GC分代年龄存储在对象的Header中的对象会被移到老年代中没有达到阀值的对象会被复制到Survivor To区。接着清空Eden区和Survivor From区新生代中存活的对象都在Survivor To区。接着Survivor From区和Survivor To区会交换它们的角色也就是新的Survivor To区就是上次GC清空的Survivor From区新的Survivor From区就是上次GC的Survivor To区总之不管怎样都会保证Survivor To区在一轮GC后是空的。GC时当Survivor To区没有足够的空间存放上一次新生代收集下来的存活对象时需要依赖老年代进行分配担保将这些对象存放在老年代中。 5、Minor GC、Major GC、Full GC之间的区别 Minor GC Minor GC指新生代GC即发生在新生代包括Eden区和Survivor区的垃圾回收操作当新生代无法为新生对象分配内存空间的时候会触发Minor GC。因为新生代中大多数对象的生命周期都很短所以发生Minor GC的频率很高虽然它会触发stop-the-world但是它的回收速度很快。 Major GC 指发生在老年代的垃圾收集动作出现了 Major GC经常会伴随至少一次 Minor GC非绝对MajorGC 的速度一般会比 Minor GC 慢10倍以上。 Full GC Full GC是针对整个新生代、老生代、元空间metaspacejava8以上版本取代perm gen的全局范围的GC。Full GC不等于Major GC也不等于Minor GCMajor GC发生Full GC需要看使用了什么垃圾收集器组合才能解释是什么样的垃圾回收。 6、Minor GC、Major GC、Full GC触发条件 Minor GC触发条件 虚拟机在进行minorGC之前会判断老年代最大的可用连续空间是否大于新生代的所有对象总空间 如果大于的话直接执行minorGC如果小于判断是否开启HandlerPromotionFailure没有开启直接FullGC如果开启了HanlerPromotionFailure, JVM会判断老年代的最大连续内存空间是否大于历次晋升晋级老年代对象的平均大小平均值的大小如果小于直接执行FullGC如果大于的话执行minorGC Full GC触发条件 老年代空间不足如果创建一个大对象Eden区域当中放不下这个大对象会直接保存在老年代当中如果老年代空间也不足就会触发Full GC。为了避免这种情况最好就是不要创建太大的对象。方法区空间不足系统当中需要加载的类调用的方法很多同时方法区当中没有足够的空间就出触发一次Full GC老年代最大可用连续空间小于Minor GC历次晋升到老年代对象的平均大小调用System.gc()时系统建议执行Full GC但是不必然执行 五、JVM监控和调优 工具 Eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试Idea中也有这么一个插件就是JProfiler 命令 -Xms 设置初始化内存分配大小默认 164 -Xmx 设置最大分配内存默认 14 -XX:PrintGCDetails 打印GC垃圾回收信息 -XX:HeapDumpOnOutOfMoryError OOM DUMP-Xmx[]:堆空间最大内存-Xms[]:堆空间最小内存一般设置成跟堆空间最大内存一样的-Xmn[]:新生代的最大内存-xx:[survivorRatio3]:eden区与fromto区的比例为31默认为41-xx[use 垃圾回收器名称]指定垃圾回收器-xss:设置单个线程栈大小一般设堆空间为最大可用物理地址的百分之80