百度推广手机网站专业app软件定制

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

百度推广手机网站,专业app软件定制,做网站的人属于什么行业,生活分享网站源码 博客风格分享小清新php源码JVM跨平台原理 跨平台#xff1a;一次编译#xff0c;到处运行 本质#xff1a;不同操作系统上运行的JVM不一样#xff0c;只需要把java程序编译成一份字节码文件#xff0c;JVM执行不同的字节码文件。 Java是高级语言#xff0c;提前编译一下#xff08;变成字节码文件…JVM跨平台原理 跨平台一次编译到处运行 本质不同操作系统上运行的JVM不一样只需要把java程序编译成一份字节码文件JVM执行不同的字节码文件。 Java是高级语言提前编译一下变成字节码文件再执行起来就会快一点 很多高级语言都可以编译成字节码格式。字节码可以到不同平台上运行这也体现的字节码的跨平台效果。 JVM整体结构 解释器执行方法区中存储的字节码指令 垃圾回收器回收垃圾对象 JIT编译器处理一些热点的字节码指令。【字节码里可能存在一些热点指令这些热点指令翻译过一次就把他们缓存起来下一次再执行热点指令就去缓存中取。从而提高执行效率】 方法区类加载子系统把字节码加载到方法区中 堆执行过程中产生的对象 Java方法栈当前线程执行到某个java里的方法就会放入这里 本地方法栈当前线程执行native方法就会放入这里用Java语言以外的语言编写的方法 程序计数器记录下一条指令的地址 类加载子系统 加载把字节码文件加载到方法区的内存空间中。 链接(static int i 10)
验证检查字节码文件的格式准备先给i变量赋值为0先赋值0解析将符号引用解析为直接引用 符号引用可以理解为类的名字一般由包名 类名确定一个类 直接引用可以理解为这个类在方法区中对应的地址 符号引用解析为直接引用类的名字解析为这个类在方法区对应的地址 初始化给类里边的static属性赋值后赋值为10 类加载器的分类 引导类加载器BootStrapClassLoader用c写的自定义类加载器继承自ExtClassLoader 或 AppClassLoader ExtClassLoader 和 AppClassLoader都继承自ClassLoader类 BootStrapClassLoader加载jre/lib目录下的类 ExtClassLoaderjre/lib/ext目录下的类 AppClassLoaderclasspath自己指定的类加载的路径 WebAppClassLoaderTomcat自定义的类加载器 双亲委派 作用避免类的重复加载防止核心API被篡改 当加载一个类的时候先从应用加载器加载这个时候应用加载器会在已加载过的库里面查看是否加载过该类如果没有就往上调使用父加载器也就是扩展类加载器来加载。 先判断当前类是否被加载过被加载过直接返回没有被加载过 查看AppClassLoader对象的parent属性是否为空如果不为空直接用parent属性加载AppClassLoader对象的parent属性就是ExtClassLoader的对象如果为空则利用BootStrapClassLoader加载 BootStrapClassLoader如果加载到就直接结束如果加载不到返回ExtClassLoader如果还是加载不到就退回AppClassLoader由它自己去加载当前类。 为什么Tomcat要自定义类加载器 为了进行类的隔离如果tomcat直接使用AppClassLoader类加载器那么会出现以下情况 应用A中有个com.xiaolin.Hello.class应用B中也有个com.xiaolin.Hello.class虽然都叫Hello.class但是这两个类的方法、属性可能不一样如果AppClassLoader先加载了应用A中的Hello.class文件那么应用B就不能被加载了因为这两个类的名字一样所以就需要针对应用A、B设置单独的类加载器也就是WebAppClassLoader这样两个应用中的Hello.class都会被各自的类加载器加载到不会产生冲突。 JVM中判断一个类是否被加载到的逻辑类名 对应的类加载器实例 运行时数据区 方法区、堆区多个线程共享 Java方法栈、本地方法栈、程序计数器每个线程都有一个 程序计数器PC 是物理寄存器的抽象实现的用来记录待执行的下一条指令的地址是程序控制流的指示器for、if else…都依赖它完成。 解释器工作时就是通过程序计数器获取下一条需要执行新的字节码指令是JVM规范中没有规定任何OutOfMemoryError情况的区域。 虚拟机栈Java栈、本地方法栈 虚拟机栈是线程私有的一个方法开始执行栈帧入栈方法执行完后对应的栈帧就出栈因此不需要进行垃圾回收。 虚拟机栈存在OutOfMemoryError内存不够、StackOverflowError栈溢出 线程太多了就可能会出现OutOfMemoryError线程创建时没有足够的空间去创建虚拟机栈了。方法调用的层数太多就可能会出现StackOverflowError 栈帧 操作数栈执行字节码指令过程中用来辅助计算的局部变量表记录方法里的每个变量的值
堆区 所有的对象和数组都应该存放在堆区在执行字节码指令的时候会把创建的对象存入堆区 对象对应的引用地址放入虚拟机栈的栈帧中。 方法执行完之后创建的对象不会立马被回收而是等JVM后台执行GC后对象才会被回收。 Eden新对象都会先放入Eden区除非对象的大小都超过Eden区那么就放入老年代 S0也叫做from区 S1也叫做to区 S0、S1都是用来存放MinorGCYGC后存在的对象 如果一个对象经过15次垃圾回收YGC后都没有被回收掉那么就会被放入老年代里 默认 新生代 : 老年代 1 : 2 Eden : S0区 : S1区 8 : 1 : 1 Yong GC / Minor GC负责堆新生代进行垃圾回收 Old GC / Major GC负责堆老年代进行垃圾回收目前只有CMS垃圾回收器会单独对老年代进行垃圾收集其他垃圾收集器基本都是整堆回收的时候堆老年代进行垃圾收集 Full GC整堆回收也会对方法区进行垃圾收集 垃圾回收过程 为什么要进行垃圾回收 垃圾是指在JVM中没有任何指向它的对象如果不清理这些垃圾他们就会一直占用内存而不能给其他对象最终垃圾对象会越来越多从而出现内存溢出。 如何标记垃圾对象 引用计数器每个对象都保存一个引用计数器属性用户记录对象被引用的次数。 优点实现简单计数为0表示是垃圾对象缺点需要额外的空间来存储引用计数需要额外的时间来维护引用计数无法处理循环引用的问题 可达性分析法以GC Root作为起始点然后一层一层找到所引用的对象被找到的对象就是存活对象其他不可达的对象就是垃圾对象。找到可达对象 GC Root是一组引用包括 线程中虚拟机栈 / 本地方法栈中正在执行的方法中的方法参数、局部变量所对应的对象引用方法区中保存的类的信息中的静态 / 常量属性所对应的对象引用 怎么回收垃圾对象 标记 - 清除算法如果可用内存不够就会暂停用户线程的执行然后执行算法进行垃圾回收 标记阶段从GC Roots开始遍历找到可达对象并在对象头中进行标记清除阶段堆内存空间进行线性遍历如果发现对象头中没有记录是可达就回收他 缺点效率不高会产生内存碎片 优点易实现 复制算法将内存空间分为两块每次使用一块进行垃圾回收时将可达对象复制到另一块没有使用的内存中然后再清除当前内存块中的所有对象后续一直重复上边操作交换着来。 只遍历一次如果可达就直接转移。比较适合垃圾对象比较多的场景复制成本低、例如新生代 优点没有标记和清除阶段不会出现内存碎片 缺点 需要更多的内存始终有一半内存空闲对象复制后对象存放的内存地址发生了变化需要额外时间修改栈帧中记录的引用地址可达对象比较多垃圾对象比较少复制算法的效率低 标记 - 整理阶段 标记阶段标记可达对象移动阶段将所有存活的对象移动到内存的一端整理阶段清除边界外所有空间
总结 新生代中的对象存活时间比较短可以利用复制算法适合垃圾对象比较多的情况 老年代中的对象存货时间比较长可以用标记 - 清除 或 标记 - 整理算法比如 CMS垃圾收集器采用的就是 标记 - 清除算法Serial Old垃圾收集器采用的就是 标记 - 整理算法 常见的垃圾收集器 Serial GC新生代和 Serial Old GC老年代工作线程暂停只有一个线程进行垃圾回收Parallel GC新生代和 Parallel Old GC老年代工作线程暂停开启多个线程进行垃圾回收 CMS GC老年代整个收集的过程更长暂停的时间变短而且在垃圾收集过程中大部分用户线程也还在执行所以用户体验更好但是吞吐量更低单位时间内执行的用户时间更少了 初始标记暂停所有工作线程标记处所有GC Roots能直接可达的对象标记完后恢复工作线程。初始标记只找到直接可达对象不需要找到所有可达对象只找了一层并发标记垃圾回收线程和用户线程一起工作垃圾回收线程也会去剩余的可达对象初始标记中没有找到的可达对象但是也会存在误差重新标记并发标记阶段可能会产生一些误差需要进行修正并发清理垃圾回收线程和用户线程一起工作删除垃圾对象可能新生成的垃圾对象没有被清除掉并发重置重置一下方便下一次垃圾回收 初始标记、并发标记、重新标记这三个阶段都是在找垃圾对象其实最费时的是并发标记阶段因为这个阶段需要找出大量的垃圾对象但是在最费时的阶段里用户线程也在工作。 G1整堆 每一个方块叫做region堆内存会分为2048个region还是分成了Eden区、S0区、S1区、老年代只不过空间是不连续的。 Humongous区专门用来存放大对象一个对象的大小超过一个region的50% 初始标记、并发标记、最终标记同CMS 筛选回收提前设置一个时间t(默认200ms)按照指定这个的时间t来做筛选回收不一定会回收掉所有的垃圾