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

洛宁网站建设泉州外贸网站开发公司

洛宁网站建设,泉州外贸网站开发公司,wordpress建博客,商城网站建设信息加载时jvm做了这三件事#xff1a; 1#xff09;通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名#xff1f; 就是类名全称#xff0c;带包路径的用点隔开#xff0c;例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名#xff0c;就…加载时jvm做了这三件事 1通过一个类的全限定名来获取该类的二进制字节流 什么是全限定类名 就是类名全称带包路径的用点隔开例如: java.lang.String。 即全限定名 包名类型 非限定类名也叫短名就是我们平时说的类名不带包的例如String 2将这个字节流的静态存储结构转化为方法区运行时数据结构 3在内存堆中生成一个代表该类的java.lang.Class对象作为该类数据的访问入口 2.验证 验证、准备、解析这三步可以看做是一个连接的过程将类的字节码连接到JVM的运行状态之中 验证是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求不会威胁到jvm的安全 验证主要包括以下几个方面的验证 1文件格式的验证验证字节流是否符合Class文件的规范是否能被当前版本的虚拟机处理 2元数据验证对字节码描述的信息进行语义分析确保符合java语言规范 3字节码验证 通过数据流和控制流分析确定语义是合法的符合逻辑的 4符号引用验证 这个校验在解析阶段发生 3.准备 为类的静态变量分配内存初始化为系统的初始值。对于final static修饰的变量直接赋值为用户的定 义值。如下面的例子这里在准备阶段过后的初始值为0而不是7 4.解析 解析是将常量池内的符号引用转为直接引用如物理内存地址指针 5.初始化 到了初始化阶段jvm才真正开始执行类中定义的java代码 1初始化阶段是执行类构造器clinit()方法的过程。类构造器clinit()方法是由编译器自动收集 类中的所有类变量的赋值动作和静态语句块(static块)中的语句合并产生的。 2当初始化一个类的时候如果发现其父类还没有进行过初始化、则需要先触发其父类的初始化。 3虚拟机会保证一个类的clinit()方法在多线程环境中被正确加锁和同步。 流程图 小插曲猜猜这东西执行结果是什么 public class ParentClass {private int parentX;public ParentClass() {setX(100);}public void setX(int x) {parentX x;} }public class ChildClass extends ParentClass{private int childX 1;public ChildClass() {}Overridepublic void setX(int x) {super.setX(x);childX x;System.out.println(ChildX 被赋值为 x);}public void printX() {System.out.println(ChildX childX);}}public class TryInitMain {public static void main(String[] args) {ChildClass cc new ChildClass();cc.printX();} }当然是1啦子类构造函数执行才会真的初始化里面的值道理不难但是要真的理解 另一个小插曲 public class ParseFile4OOM {public static void main(String[] args) {ListMapString, String lst new ArrayList();for (int i 0; i 100000; i) {MapString, String map new HashMap(3);map.put(Column1.intern(), Content1.intern());map.put(Column2.intern(), Content2.intern());map.put(Column3.intern(), Content3.intern());lst.add(map);}MapString, ListMapString, String contentCache new HashMap();contentCache.put(contents.intern(), lst);} }JDK8引入了 String 常量池。同时Hashmap 在这个业务场景下容积是固定的所以就不应该给它多分配空间就固定死为 3。 new 对象的过程 虚拟机遇到一条new指令时首先检查是否被类加载器加载如果没有那必须先执行相应的类加载过 程。类加载就是把class加载到JVM的运行时数据区的过程。 什么意思 class Lava { private int speed 5; // 5 kilometers per hour void flow() { } }class Volcano { public static void main(String[] args) { Lava lava new Lava(); lava.flow(); } } 为了运行这个程序你以某种方式把“Volcano”传给了jvm。有了这个名字jvm找到了这个类文件(Volcano.class)并读入它从类文件提取了类型信息并放在了方法区中通过解析存在方法区中的字节码jvm激活了main()方法在执行时jvm保持了一个指向当前类(Volcano)常量池的指针。 注意jvm在还没有加载Lava类的时候就已经开始执行了。正像大多数的jvm一样不会等所有类都加载了以后才开始执行它只会在需要的时候才加载。 main()的第一条指令告知jvm为列在常量池第一项的类分配足够的内存。jvm使用指向Volcano常量池的指针找到第一项发现是一个对Lava类的符号引用然后它就检查方法区看lava是否已经被加载了。 检查加载 首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用并且检查类是否已经被加载、解 析和初始化过。 符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量JAVA在编译的 时候一个每个java类都会被编译成一个class文件但在编译的时候虚拟机并不知道所引用类的地 址(实际地址)就用符号引用来代替而在类的解析阶段就是为了把这个符号引用转化成为真正的 地址的阶段。 假设People类被编译成一个class文件时如果People类引用了Tool类但是在编译时People类并 不知道引用类的实际内存地址因此只能使用符号引用org.simple.Tool来代替。而在类装载 器装载People类时此时可以通过虚拟机获取Tool类的实际内存地址因此便可以既将符号 org.simple.Tool替换为Tool类的实际内存地址。 分配内存 完成类的加载检查后虚拟机将为新生对象分配内存。为对象分配空间的任务等同于把一块确定大小的 内存从Java堆中划分出来。 内存从Java堆中划分出来。 指针碰撞 如果Java堆中内存是绝对规整的所有用过的内存都放在一边空闲的内存放在另一边中间放着一个 指针作为分界点的指示器那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等 的距离这种分配方式称为—指针碰撞。 空闲列表 如果Java堆中的内存并不是规整的已使用的内存和空闲的内存相互交错那就没有办法简单地进行指 针碰撞了虚拟机就必须维护一个列表记录上哪些内存块是可用的在分配的时候从列表中找到一块 足够大的空间划分给对象实例并更新列表上的记录这种分配方式称为—空闲列表。 选择哪种分配方式由Java堆是否规整决定而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整 理功能决定。 并发安全 除如何划分可用空间之外还有另外一个需要考虑的问题是对象创建在虚拟机中是非常频繁的行为即 使是仅仅修改一个指针所指向的位置在并发情况下也并不是线程安全的可能出现正在给对象A分配 内存指针还没来得及修改对象B又同时使用了原来的指针来分配内存的情况。 内存空间初始化 内存分配完成后虚拟机需要将分配到的内存空间都初始化为零值。这一步操作保证了对象的实例字段 在Java代码中可以不赋初始值就直接使用程序能访问到这些字段的数据类型所对应的零值。(如int值为 0boolean值为false等等)。设置 完成空间初始化后虚拟机对对象进行必要的设置例如这个对象是哪个类的实例、如何才能找到类的 元数据信息Java classes在Java hotspot VM内部表示为类元数据、对象的哈希码、对象的GC分代年 龄等信息。这些信息存放在对象的对象头之中。对象初始化 在以上工作都完成之后从虚拟机的视角来看一个新的对象已经产生了。但从Java程序的视角来看 对象创建才刚刚开始所有的字段都还为零值。所以一般来说执行new指令之后会接着把对象按照 程序员的意愿进行初始化(构造方法)这样一个真正可用的对象才算完全产生 那么问题来了对象的内存分配在堆上那么一个全局变量赋值给两个局部变量会出现互相影响的情况吗 对象在Java中是分配在堆上的但每个线程在操作对象时操作的是对象的引用而不是对象本身。因此即使对象是在堆上分配的各个线程分别操作对象引用不会直接影响到堆上的对象。 让我们解释一下 对象引用 在Java中变量存储的是对象的引用而不是对象本身。当你创建一个对象时实际上在堆上分配了内存并且变量存储的是指向该对象的引用。多个变量可以引用同一个对象。 线程操作 当你在不同的线程中将对象引用赋给不同的局部变量时每个线程操作的是各自的局部变量和引用虽然 localVar1 和 localVar2 都引用了 globalObject但它们是独立的局部变量互不影响。 总的来说尽管对象在堆上分配但在多线程环境中线程之间的独立性和引用的独立性通常由于每个线程操作自己的局部变量而得以保持因此不会产生直接的影响。线程1和线程2的操作会影响到 globalObject 引用所指向的对象最终的结果会体现在 globalObject 对象上。 GC的流程是怎么样的 说到GC垃圾回收首先要知道什么是“垃圾”垃圾就是没有用的对象那么怎样判定一个对象是不是垃 圾能不能被回收Java 虚拟机中使用一种叫作可达性分析的算法来决定对象是否可以被回收。 可达性分析就通过一组名为”GC Root的对象作为起始点从这些节点开始向下搜索搜索所走过的路径 称为引用链最后通过判断对象的引用链是否可达来决定对象是否可以被回收。 GC Root指的是 Java 虚拟机栈局部变量表中的引用的对象。也就是正在运行的方法中的局部变量所引用的对象 方法区中静态引用指向的对象。也就是类中的static修饰的变量所引用的对象 方法区中常量引用的对象。 仍处于存活状态中的线程对象。 Native 方法中 JNI 引用的对象。 优点 可达性分析可以解决引用计数器所不能解决的循环引用问题。即便对象a和b相互引用只要从GC Roots 出发无法到达a或者b那么可达性分析便不会将它们加入存活对象合集之中。 缺点 在多线程环境下其他线程可能会更新已经访问过的对象中的引用从而造成误报(将引用设置为null)或 者漏报(将引用设置为未被访问过的对象)。误报并没有什么伤害Java虚拟机至多损失了部分垃圾回收的 机会。漏报则比较麻烦因为垃圾回收器可能回收事实上仍被引用的对象内存。 一旦从原引用访问已经 被回收了的对象则很有可能会直接导致Java虚拟机崩溃。 垃圾回收算法 在标记出对象是否可被回收后接下来就需要对可回收对象进行回收。基本的回收算法有标记-清理、 标记-整理与复制算法。 标记清除算法 从”GC Roots”集合开始将内存整个遍历一次保留所有可以被 GC Roots 直接或间接引用到的对象 而剩下的对象都当作垃圾对待并回收过程分为 标记 和 清除 两个步骤。 优点实现简单不需要将对象进行移动。 缺点这个算法需要中断进程内其他组件的执行stop the world并且可能产生内存碎片提 高了垃圾回收的频率。 标记整理算法 与标记-清除不同的是它并不简单地清理未标记的对象而是将所有的存活对象压缩到内存的一端。最 后清理边界外所有的空间。 优点这种方法既避免了碎片的产生又不需要两块相同的内存空间因此其性价比比较高。 缺点所谓压缩操作仍需要进行局部对象移动所以一定程度上还是降低了效率。 简单说就是把所有数据压缩到内存条一端 复制算法 将现有的内存空间分为两快每次只使用其中一块在垃圾回收时将正在使用的内存中的存活对象复制到未被使用的内存块中。之后清除正在使用的内存块中的所有对象交换两个内存的角色完成垃圾回收
http://www.zqtcl.cn/news/356757/

相关文章:

  • 视屏网站的审核是怎么做的群辉 搭建wordpress
  • 嘉兴网站快速排名优化衡阳网站建设制作
  • 建设公共资源交易中心网站成都APP,微网站开发
  • dede网站地图修改厦门百度seo
  • 可以做行程的网站网站详情怎么做的
  • 网站建设心得8000字营销型网站建设的注意事项
  • 织梦购物网站整站源码哈尔滨网站建设技术托管
  • 做推广的网站微信号企业免费网站制作
  • 做旅游网站的引言上海公司网站建设哪家好
  • 找项目去哪个网站网站建设一条龙全包
  • 网站 数据库 模板网站系统建设合作合同范本
  • 网站空间租赁费用企业网站建设需要多少钱知乎
  • 免费建网站哪个模板多浅谈学校网站建设
  • 精致的个人网站手机网站建设基本流程图
  • 优秀网站网页设计图片主机屋做网站视频
  • 安徽网站建设电话编程一个最简单游戏代码
  • 西宁圆井模板我自己做的网站在线平面设计图
  • 浦口区网站建设技术指导做软件需要网站吗
  • 丹东有做公司网站的吗搜索引擎 wordpress
  • 做网站代理国内课程网站建设现状
  • 中国建设银行手机网站下载从零开始建设企业网站
  • 网站友情链接怎么弄seo平台
  • 建设网站一定要备案吗嘉兴做网站设计
  • 如何制作营销网站模板做外贸需要关注的网站有什么好处
  • 东莞勒流网站制作wordpress 自定义字段 查询
  • 温州网站开发风格做影视剧组演员垂直平台网站
  • c 网站开发培训怎么做网站的站点地图
  • html 网站模板简单网站制作北京海淀
  • 大庆做网站找谁珠海网站搭建
  • 网站建设方面的外文宿迁房产网找房