建设项目环保备案登记网站免费的个人网站怎么做

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

建设项目环保备案登记网站,免费的个人网站怎么做,网站建设返回函数,室内装修设计师学什么专业目录 引言
JVM是什么#xff1f; JVM和java有什么联系#xff1f; JDK、JRE、JVM有什么区别 为什么学习JVM#xff1f; JVM——从内存管理开始 运行时数据区域 分区讲解 堆 方法区 程序计数器 本地技术栈 虚拟机栈 对象的创建 指针碰撞#xff1a; 空闲列表…目录 引言     JVM是什么 JVM和java有什么联系 JDK、JRE、JVM有什么区别 为什么学习JVM JVM——从内存管理开始 运行时数据区域 分区讲解 堆 方法区 程序计数器 本地技术栈 虚拟机栈 对象的创建  指针碰撞 空闲列表 创建对象出现的问题  对象的内存布局 对象头 实例数据 对齐填充 对象的访问定位 引言     学习完java基础后为了巩固和强化java知识在查找资料后了解了JVM结合《深入理解Java虚拟机JVM高级特性与最佳实践第3版 周志明》初步学习后分享我的学习经验 JVM是什么 JVM是Java Virtual MachineJava虚拟机的缩写JVM是一种用于计算设备的规范它是一个虚构出来的计算机是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域 JVM和java有什么联系 java文件是怎么编译的呢 1.程序员编写.java文件 2.由javac把.java文件编译成.class文件交给JVM 3.JVM把.class编译成操作系统认识的01010101这样的二进制文件 JDK、JRE、JVM有什么区别 JDKjava的运行环境包含JRE主要工作就是通过javac调度把.java文件编译生成.class文件 JRE也可以独立存在负责把.class文件翻译成C交给操作系统包含JVM 这张图展示的更全面官方是最标准的 为什么学习JVM 学习JVM主要解决一行代码 类型 a new 类型; new一个对象时我们不需要考虑内存管理C/C在编写开发过程中还要考虑释放内存java不需要因为JVM会帮我们管理。 构建一个对象虚拟机为我们做了什么。知道做了什么当发生异常时我们能够更好的处理异常 JVM——从内存管理开始 运行时数据区域 分区讲解 堆 Java堆Java Heap是虚拟机所管理的内存中最大的一块。Java堆是被所 有线程共享的一块内存区域在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例Java 世界里“几乎”所有的对象实例都在这里分配内存。简单来说就是存放new处理的对象的空间每个线程都可以创建对象存入堆中所以是线程共享区 方法区 方法区Method Area与Java堆一样是各个线程共享的内存区域它用于存储已被虚拟机加载 的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。存取类信息的每一个线程都可以根据类信息创建对象那也代表可以访问方法区 程序计数器 程序计数器Program Counter Register是一块较小的内存空间它可以看作是当前线程所执行的 字节码的行号指示器。在Java虚拟机的概念模型里[1]字节码解释器工作时就是通过改变这个计数器 的值来选取下一条需要执行的字节码指令它是程序控制流的指示器分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。 他是线程独享的用来指示下一秒执行程序的行号 本地技术栈 本地方法栈Native Method Stacks与虚拟机栈所发挥的作用是非常相似的其区别只是虚拟机 栈为虚拟机执行Java方法也就是字节码服务而本地方法栈则是为虚拟机使用到的本地Native 方法服务 调用本地方法存储的区域C/C写的程序一起非java写的方法都可以认为时本地方法 虚拟机栈 虚拟机栈描述的是Java方法执行的线程内存模型每个方法被执行的时候Java虚拟机都会同步创建一个栈帧[1]Stack Frame用于存储局部变量表、操作数栈、动态连接、方法出口等信 息。每一个方法被调用直至执行完毕的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 调用方法时会把相关的信息存入虚拟机栈形成一个栈帧 对象的创建  对象的创建有两种方式指针碰撞和空闲列表 指针碰撞 假设Java堆中内存是绝对规整的所有被使用过的内存都被放在一边空闲的内存被放在另一边中间放着一个指针作为分界点的指示器那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离这种分配方式称为“指针碰撞”Bump ThePointer。 空闲列表 Java堆中的内存并不是规整的已被使用的内存和空闲的内存相互交错在一起那就没有办法简单地进行指针碰撞了虚拟机就必须维护一个列表记录上哪些内存块是可用的在分配的时候从列表中找到一块足够大的空间划分给对象实例并更新列表上的记录这种分配方式称为“空闲列表”Free List。 创建对象出现的问题  对象创建是一个非常频繁的问题 因此在并发的情况下会出现很多问题可能出现正在给对象 A分配内存指针还没来得及修改对象B又同时使用了原来的指针来分配内存的情况。 解决方案  一种是对分配内存空间的动作进行同步处理——实际上虚拟机是采用CAS配上失败 重试的方式保证更新操作的原子性什么是CAS 另外一种是把内存分配的动作按照线程划分在不同的空间之中进 行即每个线程在Java堆中预先分配一小块内存称为本地线程分配缓冲Thread Local Allocation BufferTLAB对象的内存布局 对象在堆内存中的存储布局可以划分为三个部分对象头Header、实例数据Instance Data和对齐填充Padding 对象头 对象头部分包括两类信息。第一类是用于存储对象自身的运行时数据如哈希码HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等这部分数据的长度在32位和64位的虚拟机未开启压缩指针中分别为32个比特和64个比特官方称它为“Mark Word”。 对象头的另外一部分是类型指针即对象指向它的类型元数据的指针 如果对象是一个Java数组那在对象头中还必须有一块用于记录数组长度的数据所以数组的长度可以看作是一个属性而并非是一个方法。 实例数据 该部分是对象真正存储的有效信息 对齐填充 这并不是必然存在的也没有特别的含义它仅仅起着占位符的作用。 对象的访问定位 Java程序会通过栈上的reference数据来操作堆上的具体对象。主流的访问方式主要有使用句柄和直接指针两种 使用句柄来访问的最大好处就是reference中存储的是稳定句柄地址在对象被移动垃圾收集时移动对象是非常普遍的行为时只会改变句柄中的实例数据指针而reference本身不需要被修改 使用直接指针来访问最大的好处就是速度更快它节省了一次指针定位的时间开销由于对象访问在Java中非常频繁因此这类开销积少成多也是一项极为可观的执行成本 先了解JVM对创建对象的一部分吸收消化一下。下篇讲解垃圾收集器和内存分配策略