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

网站建设报价包括哪些学生个人网页制作主题

网站建设报价包括哪些,学生个人网页制作主题,自适应网站开发资源,win10 中国建设银行网站JVM 前言 还在完善中先发布 JVM虚拟机厂家多钟多样#xff0c;具体实现细节可能不一样#xff0c;这里主要讲的是虚拟机的规范#xff0c;以下内容融合了各个平台发布的内容和周志明老师的《深入理解java虚拟机》 JVM概述 如何理解jvm跨平台#xff1f; 编译成汇编代码…JVM 前言 还在完善中先发布 JVM虚拟机厂家多钟多样具体实现细节可能不一样这里主要讲的是虚拟机的规范以下内容融合了各个平台发布的内容和周志明老师的《深入理解java虚拟机》 JVM概述 如何理解jvm跨平台 编译成汇编代码的语言例如C语言编译后的二进制文件会因为操作系统的CPU和操作位数的不同无法做到通用。编译成.class的语言不用关注操作系统的异同不同的平台安装不同的JVM代码层面不需要考虑操作系统的异同。JVM是解释运行.class文件的虚拟机不止针对java。 jvm虚拟机产品 HotSpot VM KVM(Kilobyte) JRockit JVM内存结构规范 下图只是JVM内存结构的规范具体的JVM产品实现方案可能有所不同 java代码编译的过程 通过反射了解类是如何加载的 最终调用一个本地方法库函数forName0获取Class?同时传入了一个默认的ClassLoader类 ClassLoader java的核心组件所有的class都通过ClassLoader加载进入内存。ClassLoader通过读取字节码的二进制数据流到JVM当中JVM再进行连接初始化。可以自定义ClassLoader读取指定的字节码文件在这个过程中我们就可以对这个二进制流做相应的操作。加载的字节码可以在本地jar包内远程。 一些核心的ClassLoader类举例 BootStrapClassLoader加载核心库java.* ExtClassLoader加载扩展库javaX.* AppClassLoader加载程序所在目录 自定义ClassLoader定制化加载 自定义一个ClassLoader了解双亲委派机制 一句话就是不断去父类找看那个父类加载过这个字节码有就从父类返回没有就从子类读取 好处系统不用重复加载字节码 重写ClassLoader的步骤 1.读取二进制流返回给findClass() 2.加载二进制流loadClass() public class MyClassLoader extends ClassLoader {public static void main(String[] args) throws ClassNotFoundException {MyClassLoader myClassLoader new MyClassLoader(/Users/alexyuan/Documents/codefile/giteemycode/mylearnrepository/jvmdemo/src/main/java/com/alexyuan/test/);Class? aClass myClassLoader.loadClass(Test);System.out.println(aClass.getClassLoader());System.out.println(aClass.getClassLoader().getParent().getClass().getName());System.out.println(aClass.getClassLoader().getParent().getParent().getClass().getName());System.out.println(aClass.getClassLoader().getParent().getParent().getParent());}private String path;public MyClassLoader(String path) {this.path path;}public MyClassLoader(String path, ClassLoader parentClassLoader) {super(parentClassLoader);this.path path;}Overridepublic Class? loadClass(String name) throws ClassNotFoundException {// 先调用父类的loadClass方法Class? clazz super.loadClass(name);// 自定义的类加载逻辑return clazz;}/*** 重写父类的findClass方法在ClassLoader在执行 loadClass 方法时* 如果父加载器不会加载类就会调用当前重写的方法进行加载类*/Overrideprotected Class? findClass(String name) throws ClassNotFoundException {BufferedInputStream bis null;ByteArrayOutputStream baos null;try {bis new BufferedInputStream(new FileInputStream(path name .class));baos new ByteArrayOutputStream();int len;byte[] data new byte[1024];while ((len bis.read(data)) ! -1) {baos.write(data, 0, len);}//获取内存中的完整的字节数组的数据byte[] classByteArray baos.toByteArray();//将字节数组转换为Class的实例return defineClass(null, classByteArray, 0, classByteArray.length);} catch (IOException e) {e.printStackTrace();} finally {try {if (null ! baos) {baos.close();}} catch (IOException e) {e.printStackTrace();}try {if (null ! bis) {bis.close();}} catch (IOException e) {e.printStackTrace();}}return null;} }读取字节码文件查看父类都有哪些 BootstrapClassLoaderJava的启动类加载器负责加载JRE的核心类库和启动时需要的类。 ExtensionClassLoaderJava的扩展类加载器负责加载JRE的扩展类库和用户自定义的扩展类库。 SystemClassLoaderJava的系统类加载器负责加载用户类路径中的类和资源。 URLClassLoader基于URL的类加载器可以从指定的URL列表中加载类和资源。 CustomClassLoader自定义的类加载器可以根据自己的需求实现自定义的类加载逻辑。 类的加载过程 1.加载此阶段由类加载器从指定的位置加载类的二进制数据包括从JAR文件、目录、网络等位置加载。在加载阶段类加载器需要解析类的名称、父类、接口、方法、字段等元素并将其转换为JVM可以识别的字节码格式。 2.链接此阶段由JVM对字节码进行验证、准备和解析。验证阶段会验证字节码是否符合JVM的规范包括验证类的名称、父类、接口、字段、方法等元素准备阶段会为类变量分配内存并设置默认初始值解析阶段会解析类中的静态变量、方法和类的调用关系。 3.初始化此阶段会初始化类中的静态变量和静态方法并为类变量分配内存。在初始化阶段如果类中存在静态代码块会先执行静态代码块如果类中存在静态方法会先执行静态方法。在初始化阶段JVM会为类变量分配内存并将其初始化为默认初始值。 加载方式 隐示加载new一个类初始化到内存中 显示加载Class.forName()loadClass() 显示加载的区别 loadClass()只到加载过程 forName默认初始化是true所有使用forName该类已经到初始化阶段会运行类中的静态代码块 MyClassLoader myClassLoader new MyClassLoader(/Users/alexyuan/Documents/codefile/giteemycode/mylearnrepository/jvmdemo/src/main/java/com/alexyuan/test/);Class? aClass myClassLoader.loadClass(Test);Class? aClass1 Class.forName(/Users/alexyuan/Documents/codefile/giteemycode/mylearnrepository/jvmdemo/src/main/java/com/alexyuan/test/Teat.class);Object o aClass1.newInstance();java的内存模型 计算机内存 内存模型 计算机的内存模型是指计算机内部存储数据的方式和结构。计算机的内存模型通常分为三个部分寄存器、主存储器和缓存。 寄存器寄存器是CPU中的一组高速缓存用于存储指令、数据和控制信息。寄存器的访问速度非常快但是容量有限只能存储少量的数据。 主存储器主存储器是计算机中的主要存储器用于存储大量的数据和指令。主存储器的访问速度比寄存器慢但是容量大可以存储大量的数据。 缓存缓存是计算机中的一种高速缓存技术用于缓存主存储器中的部分数据以提高访问速度。缓存的容量通常比主存储器小但是访问速度非常快。 计算机的内存模型是指将数据和指令从主存储器中加载到寄存器和缓存中并在CPU中进行处理和运算的过程。在计算机的内存模型中数据和指令的访问速度取决于它们所存储的位置从寄存器到主存储器再到缓存访问速度逐渐变慢。因此在编写高效的程序时需要考虑如何优化数据和指令的访问方式以提高程序的执行效率。 计算机内存读取寻址过程 操作系统提供的可寻址空间 32位2^32 4Gb的寻址范围 64位2^64的寻址范围 计算机地址空间划分 内核空间和用户空间是计算机操作系统中的两个概念它们用于划分计算机内存空间的不同部分。 内核空间内核空间是计算机内存空间的一部分用于存储操作系统的核心程序和数据。内核空间是计算机操作系统的核心它负责管理和控制计算机硬件资源例如处理器、内存、磁盘、网络等。内核空间的访问权限非常高只有操作系统本身才能访问。 用户空间用户空间是计算机内存空间的另一部分用于存储用户程序和数据。用户空间是用户程序的运行环境它提供了一组基本的系统调用接口用于用户程序与内核空间进行交互。用户空间的访问权限相对较低只有用户程序才能访问。 在计算机操作系统中内核空间和用户空间是通过内存保护机制实现的。内核空间和用户空间之间存在一个内存保护屏障用于隔离内核空间和用户空间的数据和指令。只有操作系统本身才能通过内存保护屏障从而访问内核空间和控制硬件资源。而用户程序只能通过系统调用接口从而访问用户空间和执行操作系统提供的基本服务。 Java在JVM当中运行内存模型 1 私有区域 程序计数器逻辑Program Counter Register 为什么它是线程私有的当多线程运行切换线程的时候如何知道线程自己的字节码运行到什么地方程序计数器的作用就是如此 1.记录线程自己的字节码运行到哪一行因此是线程私有的 2.既然记录的行号那么就可以改变程序计数器中的值让这个线程去选择读取什么地方下一行的数据 java虚拟机栈Stack java方法执行的内存模型从局部变量表中取数据在这个栈内存中通过出栈和入栈的方式进行方法的执行 由多个栈帧组成 栈帧包含局部变量表local variable操作栈Operand Stack动态链接Dynamic Linking返回地址Return Address…等组成 本地方法栈 和虚拟机栈类似运行的是native本地方法 局部变量表、操作数栈、程序计数器的关系 java为什么会栈内存溢出 从上面线程虚拟方法栈就可以看出每调用一个方法就会有一个栈帧压栈例如递归等方法如果递归的层数太深不断压栈超过了栈的大小就会出现内存溢出 共享区域 堆heap 存放几乎所有的对象实例和数组所有线程的共享区域。垃圾回收机制也就是针对堆内存的回收因此也被称为GC堆 方法区Method Area 存储已被虚拟机加载的类型信息常量静态变量JIT编译后的代码缓存数据等。 运行时常量池Runtime Constant Pool 2运行时常量池Runtime Constant Pool是方法区的一部分。Class文件中除了有类的版本、字 段、方法、接口等描述信息外还有一项信息是常量池表Constant Pool Table用于存放编译期生 成的各种字面量与符号引用这部分内容将在类加载后存放到方法区的运行时常量池中。 在jvm规范中方法区除了存储类信息之外还包含了运行时常量池。这里 首先要来讲一下常量池的分类 常量池可分两类 1、Class常量池静态常量池 2、运行时常量池 3、字符串常量池没有明确的官方定义其目的是为了更好的使用 String 真实的存储位置在堆 对象 对象内存布局 jvm调优 目的 解决生产环境中日志不输出死锁cpu占用过高如何分配线程数等问题在于让程序跑起来也让程序跑的更快。 JVM参数分类 根据jvm参数开头可以区分参数类型共三类“-”、“-X”、“-XX” 标准参数“-”每种类型的Jvm都会实现-help-version 非标准参数“-X”默认Jvm实现这些功能但不是一定完全实现-Xms,-Xmx等 非Stable参数“-XX”不稳定随着版本的不一致参数也不一致 -X参数 ■ -Xms20m 设置jvm初始化堆大小为20m一般与-Xmx相同避免垃圾回收完成后jvm重新分。 ■ -Xmx20m设置jvm最大可用内存大小为20m。 ■ -Xmn10m设置新生代大小为20m。 ■ -Xss128k设置每个线程的栈大小为128k。 -XX参数 Java -XX:PrintFlagsFinal -version #打印系统XX参数-XX:PrintGCDetails打印GC详情 -XX:PrintGCTimeStamps打印时间戳 ■ -XX:CMSInitiatingOccupancyFraction80 CMS gc表示在老年代达到80%使用率时马上进行回收 ■ -verbose:gc可以输出每次GC的一些信息 ■ -XX:-UseConcMarkSweepGC使用CMS收集器 GC信息查看 打印GC简单信息 -verbose:gc -XX:PrintGC 打印详细GC信息 -XX:PrintGCDetails -XX:PrintGCTimeStamps 指定GC日志以文件输出 -Xloggc:./gc.log 使用jps和jinfo查看java进程运行状态 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P5a4EsQL-1692237885248)(assets/ wps1.jpg)] Jvm运行模式设置 Server模式性能强64位默认为该模式。Client模式性能较弱32位系统可以使用该模式。 1.7内存模型介绍 执行过程eden区域满了将进入survivor去survivor区未被回收的对象转移到tenured区域tenured的没有回收的对象进入永久区。 Survivor区结构两个相同的survivor区构成。运行时候只会使用一个另外一个用做gc回收机制时复制对象使用。 Perm永久区一般存储class和file。一段时间tenured没有被回收将会进入这个区域。 1.8内存模型介绍 1.8版本取消永久区使用元素区代替元素区为本机内存不再jvm当中。 1.8版本jvm对内存组成 Young区两个survivor区eden MetaSpaceccscodecache Jstat查看堆内存使用情况 命令可使用的参数 命令格式jstat –{选项} 进程id 间隔时间 查询次数 Jmap使用对堆内存进行统计 Jmap参数 Mat工具对jdump文件分析 将内存情况保存为“.dat”文件使用mat打开文件 使用Jstack查看当前jvm中运行现场的情况 线程状态介绍 初始态刚刚启动的状态也就是刚刚调用start()函数的状态 运行态在CPU中运行 就绪等待CPU资源就可执行 阻塞没有获得资源一直请求超时后进入阻塞队列当获取的资源之后进入就绪 等待态需要获取的启动资源属于被动等待 超时等待主动进入等待状态如sleep函数 终止态线程运行结束 使用jmx查看内存和线程使用状况 在JDK中bin目录双击打开 JVM——垃圾回收机制 什么是垃圾回收 程序在运行时需要申请内存内存使用之后需要归还内存给系统当一些无效对象一直占用内存就可能导致内存溢出因此需要对无效对象进行垃圾回收。 垃圾回收算法 垃圾回收算法——引用计数算法 概述每个对象都设置一个计数器如果有对象引用它计数器进行加一引用结束减一系统对对象的计数器进行判断如果计数器为0者回收该对象 缺点无法回收循环引用也就是只要是改对象被引用这就不会被回收无论这个引用是否指向null或者未被使用。 垃圾回收算法——标记清除法 概述当系统做垃圾回收的时候暂停所有线程遍历所有对象标记处对象的引用关系清楚root对象未被应用到的对象。 缺点性能低由于对象可能在不同内存中回收的内存很可能不连续也就是内存碎片化严重。 垃圾回收算法——标记压缩算法 概述由标记清楚法演变而来在回收之前将有效对象压缩在一个连续的内存再回收这样解决了回收内存碎片化的问题 缺点性能比优化之前更低 垃圾回收算法——复制算法 概述将内存分为两块一块使用另一块闲置当进行垃圾回收的时候将有效对象放在闲置内存当中在将内存情况两个内存空间交换角色然后重复之前的操作 缺点运行时有一块内存空间没有使用因此有点资源浪费 应用区域young中的survivor由两块相同的内存空间构成就是使用的复制算法这样垃圾回收的区域是完整的一块内存空间没有碎片化。 回收算法总结 每一个算法都各有有点根据不同区域的特性不同使用不同算法年轻代对象少可以使用复制算法gen区对象多适合标记清楚和标记压缩算法。 垃圾收集器以及内存分配 算法只是实现方式在java内部提供了一些垃圾回收器垃圾回收器去完成垃圾的回收。 串行收集器 只有一个线程执行收集器一般不用 并行收集器 Parnew收集器 将串行收集器改成并行而来 ParallelGC收集器 在parnew的基础上增加了吞吐量的设置 CMS垃圾收集器 算法标记清除算法 工作位置老年带 Stw线程全部暂停stop world 标记时会触发stw G1垃圾回收器 概述取消了老年带年轻代的概念清理工作是将对象从一个区复制到另一个区。G1为因为巨形对象在拷贝的时候对回收器性能影响很大因此具有一个humongous区域。 G1垃圾回收器使用流程 第一步打开G1作为垃圾回收器 第二步设置最大停顿时间也就是标记清除的时候 第三步设置堆最大内存 YoungGC 对年轻带进行GCeden空间向survivor空间复制转移也向old区转移 MixGC 主要GCyoung区也GCold区 G1垃圾回收如何找到根对象 使用remember set方式就是每个空间初始化的时候生成一个set集合这个集合记录这片空间被引用的空间通过这些set集合找到根对象然后从 使用G1垃圾回收器 1.jvm参数 -XX:UseG1GC -XX:MaxGCPauseMillis100 -Xmx256m -XX:PrintGCDetails -XX:PrintGCTimeStamps -XX:PrintGCDateStamps -XX:PrintHeapAtGC -Xloggc:E://test//gc.log GC历史文件在:E://test//gc.log目录下打开https://gceasy.io/文件查看吞吐量 参考文献 《深入理解java虚拟机周志明》 ↩︎ 《深入理解java虚拟机周志明》 ↩︎
http://www.sczhlp.com/news/277531/

相关文章:

  • 网站备案有什么作用沧州免费网站建设
  • 知名网站开发哪里有dw怎么做网站教程
  • 做网站需要注册商标是几类微商手机网站制作公司哪家好
  • 南京网站托管网络营销外包google高级搜索
  • 公司网站建设管理五十一团 黑龙江生产建设兵团知青网站
  • 在线视频网站怎么做商城网站建设需要注意什么
  • 国外好的网站阿里巴巴网页设计教程
  • 优秀设计网站大全wordpress 账户及密码
  • C#记录类型中意外的数据不一致问题解析
  • 做一个网页容易吗seo推广专员工作好做吗
  • 用python做网站后台票务网站开发端口
  • qq群网站推广广西建设官方网站
  • 最新域名网站网站建设go
  • 网站建设设计多少钱海珠企业网站建设
  • 没有备案的网站 公司服务器 查到会怎么样wordpress产品展示
  • 网站大图轮播成品网站是什么意思
  • 用来网站备案注册什么公司好西安网站制作有限公司
  • 抚顺网站设计wordpress调用一篇文章
  • 深圳营销型网站建设 龙华信科wordpress调整固态链接后打不开
  • 买了两台服务器可以做网站吗廊坊百度推广代运营
  • 网站开发如何进行管理重庆市园林建设有限公司网站
  • 贵州建设厅报名登录网站旅游网站建设的目的与意义是什么意思
  • 做网站海报深圳宝安网站建设公司推荐
  • 高端网站制作建设做网站通常又什么开发完成
  • 网站建设教程推荐抖音小程序怎么添加
  • 河南省建设厅网站门户ui设计自学教程500集
  • 徐州提供网站建设报价表商城app制作教程
  • 网站运营与建设作业建设彩票网站如何盈利
  • 怎么做有趣视频网站湖北建设网站信息查询中心
  • 网站开发过程中感想2021建站公司