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

网站集约化建设情况汇报如何让百度抓取网站

网站集约化建设情况汇报,如何让百度抓取网站,做网站的公司应该税率多少,百度站长平台网页版1、前言 今天将和你一起探讨Java虚拟机#xff08;JVM#xff09;的性能调优。 JVM算是面试中的高频问题了#xff0c;通常情况下总会有人问到#xff1a;请你讲解下 JVM 的内存模型#xff0c;JVM 的 性能调优做过#xff1f; 2、为什么 JVM 在 Java 中如此重要 首…1、前言 今天将和你一起探讨Java虚拟机JVM的性能调优。 JVM算是面试中的高频问题了通常情况下总会有人问到请你讲解下 JVM 的内存模型JVM 的 性能调优做过 2、为什么 JVM 在 Java 中如此重要 首先你应该知道运行一个Java应用程序我们必须要先安装 JDK 或者 JRE 包。 这是因为 Java应用在编译后会变成字节码然后通过字节码运行在 JVM 中而 JVM 是 JRE 的核 心组成部分。 JVM不仅承担了Java字节码的分析JIT compiler和执行Runtime同时也内置了自动内 存分配管理机制。 这个机制可以大大降低手动分配回收机制可能带来的内存泄露和内存溢出风险使 Java开发人员 不需要关注每个对象的内存分配以及回收从而更专注于业务本身。 3、从了解内存模型开始 JVM 自动内存分配管理机制的好处很多但实则是把双刃剑。 这个机制在提升Java开发效率的同时也容易使 Java 开发人员过度依赖于自动化弱化对内存的 管理能力这样系统就很容易发生 JVM 的堆内存异常垃圾回收GC的方式不合适以及 GC 次数过于频繁等问题这些都将直接影响到应用服务的性能。 因此要进行 JVM 层面的调优就需要深入了解 JVM 内存分配和回收原理这样在遇到问题 时我们才能通过日志分析快速地定位问题也能在系统遇到性能瓶颈时通过分析JVM 调优来 优化系统性能。 这也是整个模块的重点内容今天我们就从 JVM 的内存模型学起为后续的学习打下一个坚实的 基础。 4、JVM内存模型的具体设计 我们先通过一张 JVM 内存模型图来熟悉下其具体设计。 在 Java 中JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。 我们来分析JVM 的 5 个分区具体是怎么实现的呢 1.堆Heap 堆是 JVM 内存中最大的一块内存空间该内存被所有线程共享几乎所有对象和数组都被分配到 了堆内存中。 堆被划分为新生代和老年代新生代又被进一步划分为 Eden 和Survivor 区最后 Survivor 由 From Survivor和To Survivor 组成。 在 Java6 版本中永久代在非堆内存区到了 Java7 版本永久代的静态变量和运行时常量池被 合并到了堆中而到了 Java8永久代被元空间取代了。 结构如下图所示 2.程序计数器Program Counter Register 程序计数器是一块很小的内存空间主要用来记录各个线程执行的字节码的地址例如分支、循 环、跳转、异常、线程恢复等都依赖于计数器。 由于Java是多线程语言当执行的线程数量超过CPU数量时线程之间会根据时间片轮询争夺 CPU资源。 如果一个线程的时间片用完了或者是其它原因导致这个线程的CPU资源被提前抢夺那么这个退 出的线程就需要单独的一个程序计数器来记录下一条运行的指令。 3.方法区Method Area 很多开发者都习惯将方法区称为“永久代”其实这两者并不是等价的。 HotSpot 虚拟机使用永久代来实现方法区但在其它虚拟机中例如Oracle的JRockit、IBM 的 J9 就不存在永久代一说。 因此方法区只是 JVM 中规范的一部分可以说在HotSpot 虚拟机中设计人员使用了永久代 来实现了 JVM 规范的方法区。 方法区主要是用来存放已被虚拟机加载的类相关信息包括类信息、运行时常量池、字符串常量 池。类信息又包括了类的版本、字段、方法、接口和父类等信息。 JVM在执行某个类的时候必须经过加载、连接、初始化而连接又包括验证、准备、解析三个阶 段。 在加载类的时候JVM会先加载 class 文件而在 class 文件中除了有类的版本、字段、方法和接 口等描述信息外还有一项信息是常量池 (Constant Pool Table)用于存放编译期间生成的各种字 面量和符号引用。 字面量包括字符串String a“b”、基本类型的常量final 修饰的变量符号引用则包括类和 方法的全限定名例如 String 这个类它的全限定名就是Java/lang/String、字段的名称和描述 符以及方法的名称和描述符。 而当类加载到内存中后JVM 就会将 class 文件常量池中的内容存放到运行时的常量池中在解析 阶段JVM 会把符号引用替换为直接引用对象的索引值。 例如类中的一个字符串常量在 class 文件中时存放在 class 文件常量池中的在 JVM加载完类 之后JVM 会将这个字符串常量放到运行时常量池中并在解析阶段指定该字符串对象的索引 值。 运行时常量池是全局共享的多个类共用一个运行时常量池class 文件中常量池多个相同的字符 串在运行时常量池只会存在一份。 方法区与堆空间类似也是一个共享内存区所以方法区是线程共享的。假如两个线程都试图访问 方法区中的同一个类信息而这个类还没有装入 JVM那么此时就只允许一个线程去加载它另 一个线程必须等待。 在 HotSpot 虚拟机、Java7 版本中已经将永久代的静态变量和运行时常量池转移到了堆中其余 部分则存储在JVM 的非堆内存中而 Java8 版本已经将方法区中实现的永久代去掉了并用元空 间class metadata代替了之前的永久代并且元空间的存储位置是本地内存。 之前永久代的类的元数据存储在了元空间永久代的静态变量class static variables以及运行 时常量池runtime constant pool则跟 Java7 一样转移到了堆中。 那你可能又有疑问了Java8 为什么使用元空间替代永久代这样做有什么好处呢 官方给出的解释是 移除永久代是为了融合 HotSpot JVM 与 JRockit VM 而做出的努力因为JRockit 没有永久代所 以不需要配置永久代。 永久代内存经常不够用或发生内存溢出爆出异常 java.lang.OutOfMemoryError: PermGen。 这是因为在 JDK1.7 版本中指定的 PermGen 区大小为 8M由于PermGen 中类的元数据信息在 每次 FullGC 的时候都可能被收集回收率都偏低成绩很难令人满意还有为 PermGen分配多 大的空间很难确定PermSize的大小依赖于很多因素比如JVM加载的 class 总数、常量池的大 小和方法的大小等。 4.虚拟机栈VM stack Java虚拟机栈是线程私有的内存空间它和Java 线程一起创建。 当创建一个线程时会在虚拟机栈中申请一个线程栈用来保存方法的局部变量、操作数栈、动态 链接方法和返回地址等信息并参与方法的调用和返回。每一个方法的调用都伴随着栈帧的入栈操 作方法的返回则是栈帧的出栈操作。 5.本地方法栈Native Method Stack 本地方法栈跟 Java 虚拟机栈的功能类似Java虚拟机栈用于管理 Java 函数的调用而本地方法 栈则用于管理本地方法的调用。 但本地方法并不是用 Java 实现的而是由C语言实现的。 5、JVM的运行原理 看到这里相信你对 JVM 内存模型已经有个充分的了解了。 接下来我们通过一个案例来了解下代码和对象是如何分配存储的Java 代码又是如何在 JVM 中运行的。 public class JVMCase {// 常量public final static String MAN_SEX_TYPE man;// 静态变量public static String WOMAN_SEX_TYPE woman;public static void main(String[] args) {Student stu new Student();stu.setName(nick);stu.setSexType(MAN_SEX_TYPE);stu.setAge(20);JVMCase jvmcase new JVMCase();// 调用静态方法print(stu);// 调用非静态方法jvmcase.sayHello(stu);}// 常规静态方法public static void print(Student stu) {System.out.println(name: stu.getName() ; sex: stu.getSexType}// 非静态方法public void sayHello(Student stu) {System.out.println(stu.getName() say: hello); }}class Student{private String name;private String sexType;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public String getSexType() {return sexType;}public void setSexType(String sexType) {this.sexType sexType;}public int getAge() {return age;}public void setAge(int age) {this.age age;}} 当我们通过 Java 运行以上代码时JVM 的整个处理过程如下 1.JVM向操作系统申请内存 JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间根据内存大小找到具 体的内存分配表然后把内存段的起始地址和终止地址分配给 JVM接下来 JVM 就进行内部分 配。 2.JVM进行内部分配 JVM 获得内存空间后会根据配置参数分配堆、栈以及方法区的内存大小。 3.class文件加载、验证、准备以及解析 其中准备阶段会为类的静态变量分配内存初始化为系统的初始值。 4.初始化阶段 完成上一个步骤后将会进行最后一个初始化阶段。 在这个阶段中JVM首先会执行构造器 clinit 方法编译器会在.java 文件被编译成.class 文件 时收集所有类的初始化代码包括静态变量赋值语句、静态代码块、静态方法收集在一起成为 clinit() 方法。 5.执行方法 启动main线程执行main方法开始执行第一行代码。 此时堆内存中会创建一个student对象对象引用 student 就存放在栈中。 此时再次创建一个 JVMCase 对象调用 sayHello 非静态方法sayHello 方法属于对象 JVMCase此时sayHello 方法入栈并通过栈中的 student 引用调用堆中的 Student对象之后 调用静态方法 printprint静态方法属于 JVMCase 类是从静态方法中获取之后放入到栈中也 是通过 student 引用调用堆中的student 对象。 了解完实际代码在 JVM 中分配的内存空间以及运行原理相信你会更加清楚内存模型中各个区域 的职责分工。 6、总结 我们主要学习了最基础的内存模型设计了解其各个分区的作用及实现原理。 在 Java 中JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。 堆是 JVM 内存中最大的一块内存空间该内存被所有线程共享。 程序计数器是一块很小的内存空间主要用来记录各个线程执行的字节码的地址例如分支、循环、跳转、异常、线程恢复等都依赖于计数器。 方法区只是 JVM 中规范的一部分方法区主要是用来存放已被虚拟机加载的类相关信息包括类信息、运行时常量池、字符串常量池。 Java虚拟机栈用于管理 Java 函数的调用而本地方法栈则用于管理本地方法的调用。 如今JVM在很大程度上减轻了Java开发人员投入到对象生命周期的管理精力。 在使用对象的时候JVM会自动分配内存给对象在不使用的时候垃圾回收器会自动回收对象 释放占用的内存。
http://www.tj-hxxt.cn/news/226445.html

相关文章:

  • 网站运营主体wordpress网站放icp
  • 国内网站赏析建筑工程防护网
  • 申请域名后如何发布网站山东广饶建设银行网站
  • 辽宁建设官方网站汕头人才网
  • 四川建设网网站软件开发培训学校驾校宝典
  • php在线做网站永久免费网站系统
  • 苏网站建设网站显示速度的代码是什么意思
  • 创建吃的网站怎么做佛山seo扣费
  • 网站标志的原则领英如何创建公司主页
  • 苏州网站关键字优化wordpress用户访问频率
  • 比格设计官网西安百度seo排名软件
  • 网站建设谈单技巧WordPress推送百家号
  • 商务定制网站自己电脑如何做网站服务器
  • 做餐饮店铺哪个网站深圳做生鲜食材的网站叫什么
  • 淄博三合一网站开发友情链接代码美化
  • 吉林天宇建设集团网站手机软件开发公司
  • 域名出售网站宁波网站建设公司哪有
  • 北京cms建站系统十大网红电商
  • 无锡免费建设网站美妆网页设计代码大全
  • 访问数据库的网站开发语言网站接电话
  • 哪个网站银锭专业做银锭的公众号链接电影网站怎么做
  • 保定网站优化公司站长工具seo优化建议
  • 黑龙江网站建设巨耀网络企业如何制作网站管理系统
  • 自己做的网站怎样让百度搜到广州专业拓客团队联系方式
  • 做网站需要什么许可证大连网站开发培训班
  • 上海智能网站建设wordpress并发
  • 网站建设汇编材料建设什么网站可以赚钱
  • 网站设计有限公司怎么样东莞市莞城建筑工程有限公司
  • 学校校园网站使用湛江做网站的网站
  • 门户网站建设工作制度建立情况免费定制开发软件