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

如何做一个购物网站页面非标准零加工

如何做一个购物网站页面,非标准零加工,图怪兽在线制作图片,wordpress中文版 dockerJVM类加载过程类什么时候被加载什么情况下会发生栈内存溢出JVM内存模型常量池回收方法区垃圾回收流程圾收集算法分代收集理论标记-清除算法标记-复制算法标记-整理算法类加载过程 加载–验证–准备–解析–初始化–使用–卸载 ​ 加载#xff1a;通过全类名获取类的二进制流… JVM类加载过程类什么时候被加载什么情况下会发生栈内存溢出JVM内存模型常量池回收方法区垃圾回收流程圾收集算法分代收集理论标记-清除算法标记-复制算法标记-整理算法类加载过程 加载–验证–准备–解析–初始化–使用–卸载 ​ 加载通过全类名获取类的二进制流然后解析成静态数据结构存储在方法区并在堆中生成一个便于用户调用的java.lang.Class类型的对象 ​ 验证验证class文件的格式是够正确 。不会威胁到JVM安全 ​ 准备为类的静态变量分配内存并初始化值 ​ 解析将类接口、字段和方法符号引用转为直接引用假设一个类A被编译成class文件并且A引用了B在编译阶段A就需要一个字符串去记录B的地址字符串就叫符号引用在运行时A类被加载但是B未被加载那么将加载B此时A的符号引用会被替换成B的实际地址 ​ 初始化初始化就是类加载的最后一个阶段了。准备阶段变量可能已经被赋过初值了初始化的时候会根据程序代码的要求来对类里的一些变量和数据进行操作。也可以说就是在调用clinit()方法 类什么时候被加载 创建类的实例也就是new一个对象访问某个类或接口的静态变量或者对该静态变量赋值 (注类中的static final 修饰的基本类型及String类型成员变量被访问是不会触发类加载的静态内部类也是被访问不会触发类加载) 调用类的静态方法反射初始化一个类的子类会首先初始化子类的父类JVM启动时标明的启动类即文件名和类名相同的那个类 手动触发类加载 class.forname 如果两个线程同时class.forname,只会加载一次第二个会阻塞第二个会他也就跟着返回的了 什么情况下会发生栈内存溢出 当线程请求的栈深度超过了虚拟机允许的最大深度时会抛出StackOverFlowError异常方法递归调用可能会出现该问题调整参数-xss去调整jvm栈的大小 JVM内存模型 思路 给面试官画一下JVM内存模型图并描述每个模块的定义作用以及可能会存在的问题如栈溢出等。 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 这些区域有各自的用途以及创建和销毁的时间有的区域随着虚拟机进程的启动而一直存在有些区域则是依赖用户线程的启动和结束而建立和销毁。 创建对象会放在堆里面. 信息、类信息开始进入方法区程序执行进入栈当中在栈当中有new这些操作引出堆的调用栈的运行由程序计数器配合计时进行实现需要操作系统执行的话就需要依赖本地方法栈翻译成计算机可以执行的语言来进行操作。 线程共享 堆—存实例化的对象方法区—主要存放的是class类信息 线程独享 程序计数器—存下一行要执行的行号虚拟机栈—存栈帧局部变量表本地方法栈—调用本地方法的时候存的数据 1、程序计数器 线程私有线程间会切换为了让线程切换回来指定到准确的位置需要有独立的程序计数器记录这个线程执行到了哪里下一行改执行哪个指令。程序计算器是唯一不会发生内存溢出的地方。如果正在执行的是Native 方法由于不是JVM执行则这个计数器值为空。 2、Java虚拟机栈 线程私有每个方法执行的时候在虚拟机里面同步创建一个栈帧存储局部变量表、操作数栈、动态连接、方法出口等信息。方法从被调用到执行完毕就对应着一个栈帧。 【编译的时候就能知道方法需要多少位空间如果是字符串型(不确定位数)会存一个指向这个指向占固定位数】 3、本地方法栈 和上面类似java底层封装了c语言操作系统不认识需要翻译成本地的c语言【将自己本身封装的方法重新翻译成操作系统可识别的方法C和汇编本地方法栈和操作系统进行沟通。】本地方法栈是操作系统本地的方法本地方法栈是线程私有的java虚拟机调用本地方法时,需要给本地方法提供的内存空间。存的是native信息当一个JVM创建的线程调用native方法后jvm不会在虚拟机栈中为该线程创建栈帧而是简单的动态链接直接调用该方法。 堆中的方法能不能被gc回收可以方法区中的东西可以被gc回收嘛可以类型卸载栈中的东西不需要回收方法执行完栈就销毁了。 4、Java堆 **线程共享**存对象实例所有的对象实例以及数组都应当在堆上分配但是其中仍然有线程私有的区域称为TLAB它可以提高对象分配的效率Java堆是垃圾收集器管理的内存区域从分配内存的角度看所有线程共享的Java堆中可以划分出多个线程私有的分配缓冲区将Java堆细分的目的只是为了更好地回收内存或者更快地分配内存对于**基本数据类型对象**在方法体内声明时会直接分配在栈中,其它情况都会分配在堆中。对于**普通对象来说**JVM 会首先在堆上创建对象然后在其他地方使用它的引用。 5、方法区 线程共享存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。在JDK 6的时候HotSpot开发团队就有放弃永久代逐步改为采用本地内存来实现方法区的计划。到了JDK 7的HotSpot已经把原本放在永久代的字符串常量池、静态变量等移出。JDK 8终于完全废弃了永久代的概念 6、运行时常量池 运行时常量池是方法区的一部分 7、直接内存 物理上内存条JVM占的内存是我们自己写的C和汇编所占据的内存不属于JVM数据区一部分属于本机运行内存。执行JVM的时候还需要调用操作系统内核提供的方法操作系统也需要消耗内存这时就用到了直接内存一般程序都消耗直接内存知识扩展操作系统调取内核提供的方法内核连接驱动驱动硬件只识别汇编语言硬件中加了存储功能有一套翻译支持C语言的识别 常量池 JVM常量池主要分为Class文件常量池、运行时常量池全局字符串常量池以及基本类型包装类 对象常量池。 ●Class文件常量池。在java代码的编译期间 我们编写的java文件就被编译为.class文件格式的二进制数据存放在磁盘中其中就包括class文件常量池。 ●**运行时常量池:**方法区内 字符串常量池:在HotSpot VM中它是一个叫做StringTable的全局表。string”或通常所说的进入了字符串常量池的字符串”。存放在堆中 ●基本类型包装类对象常量池: 这些类是Byte, Short,Integer,Long,Character,Boolean,。另外上面这5种整型的包装类也只是在对应值小于等于 127时才可使用对象池也即对象不负责创建和管理大于127的这些类的对象。 回收方法区 方法区又称元空间或者永久代HotSpot虚拟机中老版本的叫法 主要回收内容 废弃的常量 已经没有任何字符串对象引用常量池中的“java”常量且虚拟机中也没有其他地方引用这个字面量如果在这时发生内存回收而且垃圾收集器判断确有必要的话这个“java”常量就将会被系统清理出常量池 不再使用的类 判定一个类型是否属于“不再被使用的类”的三个条件: 1.该类所有的实例都已经被回收也就是Java堆中不存在该类及其任何派生子类的实例。 2.加载该类的类加载器已经被回收 3.该类对应的java.lang.Class对象没有在任何地方被引用无法在任何地方通过反射访问该类的方法。 垃圾回收流程 当一个对象被实例化后首先先尝试存在eden区若Eden区存不下将触发一次minor GC若空间不够则看存活区的空间是否够要是够的话将Eden区的存活时间长的对象放到存活区将新创建的对象分配到Eden区要是不够的话看老年代的空间是否够要是够的话将存活区的存活时间比较长的对象存到老年代然后将Eden区的存活时间比较长的存到存活区将新创建的分配搭到Eden区。若空间仍不够触发一次full GC,重复操作若最后空间仍不足抛出异常。 圾收集算法 垃圾收集灵魂三问 判定哪些对象是垃圾什么时候回收怎么进行回收 分代收集理论 当前的垃圾收集器大多数都遵循了“分代收集”的理论进行设计分代收集理论实质是一套符合大多数程序运行实际情况的经验法则建立在两个分代假说之上 1弱分代假说绝大多数对象都是朝生夕灭的。不用分代全部死亡 2强分代假说熬过越多次垃圾收集过程的对象就越难以消亡。活时间越长的越难死 上面两个假说奠定了一个原则收集器应该将Java堆划分出不同的区域然后将回收对象依据其年龄年龄即对象熬过垃圾收集过程的次数分配到不同的区域之中存储。 一般把Java堆划分为新生代和老年代。 在新生代中每次垃圾收集时都发现有大批对象死去而每次回收后存活的少量对象将会逐步晋升到老年代中存放。 一个问题想将新生代的对象回收但是这个对象可能是老年代的对象指向(引用)的它为了找出该区域中的存活对象不得不在固定的GC Roots之外再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性反之也要把新生代全部遍历一遍。 —会产生很大的性能负担因此产生了跨代引用假说 3跨代引用假说跨代引用相对于同代引用来说仅占极少数。 依据这条假说我们就不应再为了少量的跨代引用去扫描整个老年代也不必浪费空间专门记录 每一个对象是否存在及存在哪些跨代引用;只需在新生代上建立一个全局的数据结构该结构被称 为“记忆集”这个结构把老年代划分成若干小块标识出老年代的哪一块内存会 存在跨代引用。此后当发生Minor GC时只有包含了跨代引用的小块内存里的对象才会被加入到GC Roots进行扫描。 统一定义 部分收集指目标不是完整收集整个Java堆的垃圾收集其中又分为 新生代收集指目标只是新生代的垃圾收集。老年代收集指目标只是老年代的垃圾收集。目前只有CMS收集器会有单独收集老年代的行为。混合收集指目标是收集整个新生代以及部分老年代的垃圾收集。目前只有G1收集器会有这种行为。 整堆收集收集整个Java堆和方法区的垃圾收集。 标记-清除算法 标记出哪些需要回收或哪些不需要回收按照标记进行回收。这是比较基础的算法其他的垃圾回收算法是以它为基础改进的 标记-清除算法缺点 1是执行效率不稳定2是内存空间的碎片化问题 标记-复制算法 为了解决标记-清除算法面对大量可回收对象时执行效率低的问题提出了一种称为“半区复制”的垃圾收集算法—将可用内存按容量划分为大小相等的两块每次只使用其中的一块。当这一块的内存用完了就将还存活着的对象复制到另外一块上面然后再把已使用过的内存空间一次清理掉。两边循环往复。 标记-复制算法优点 实现简单运行高效 标记-复制算法缺点 可用内存缩小为了原来的一半存活的对象比较多的时候来回复制对象导致效率很低 标记-复制算法的优化 Appel式回收—》 Appel式回收的具体做法是把新生代分为一块较大的Eden空间和两块较小的 Survivor空间每次分配内存先占用Eden空间垃圾收集的时候Eden存活的对象放入到Survivor1当中清理掉Eden中的对象Survivor1当中存活的放入到Survivor2当中清理掉Survivor1当中的对象Survivor2满了之后将存活的放入到Eden中清除Survivor2中所有的对象永远Eden区域优先存储对象。以此类推两块满了之后回收的进入另外一块。 进一步优化——》 如果Eden区域存活下来的对象比较多那么会出现两个Survived区域装不下的情况所以需要依赖其他内存区域实 际上大多就是老年代进行分配担保。这些对象将通过分配担保机制直 接进入老年代 标记-复制算法缺点在对象存活率较高时就要进行较多的复制操作效率将会降低如果 不想浪费50%的空间就需要有额外的空间进行分配担保以应对被使用的内存中所有对象都100%存 活的极端情况。—老年代里面不能用这样的算法 【空间分配担保新生代与老年代的占比一般是12在新生代中假如Eden区域30%的数据存活了下来这样两个Survivor区域放不下这30%的对象就将这三成数据直接放入老年代叫做空间分配担保】 标记-整理算法 标记过程一样后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向内存空间一端移动然后直接清理掉边界以外的内存。 标记整理算法是需要移动对象的移动对象是相对来说比较消耗时间的。
http://www.w-s-a.com/news/216429/

相关文章:

  • 宿松网站建设推荐秒搜科技国家官方网站
  • 网站的服务器选择wordpress文章底部加分享
  • 天津专业的网站建设公司阿里云服务器 wordpress
  • 家教辅导培训网站建设中东跨境电商平台有哪些
  • 商城形式的网站需要多少钱做医药商城网站的公司吗
  • 贵阳网站设计zu97彩票创建网站
  • 网站建设与分工的论文足球世界排名
  • 网站首页添加标签如何用模板建站
  • 官方网站包括哪几个网站泰安的网站建设公司哪家好
  • 域名虚拟服务器做网站如何搭建企业网站
  • 用手机做网站服务器口碑好的常州网站建设
  • 摄影网站的设计与实现开题报告太原企业自助建站
  • 做如美团式网站要多少钱做网站怎么去文化局备案
  • 桂平市住房和城乡建设局网站网站建设与管理自考题
  • 怎么做公司网站制作凡科官方网
  • 达人设计网官方网站建筑效果图网站有哪些
  • 网站定制哪家快建筑室内设计网
  • 网站创建方案论文旅游网站的设计与制作html
  • 网站建设的数据导入导出开发小程序需要多少钱费用
  • 局网站建设进入前十名wordpress user role editor
  • 网站托管如何收费搜一下百度
  • 中国建设劳动协会网站wordpress 区块链媒体
  • 网站开源是什么意思西安做网站科技有限公司
  • 自己怎么用h5做网站肇庆seo
  • 长沙网站seo优化公司东莞企业官方网站建设
  • 网站个人备案材料北京网站推广价格
  • 百度做任务的网站电子工程网网站
  • 中介订制网站开发玉溪网站建设设计
  • 免费网站免费无遮挡手机页面设计软件
  • 网站建设需求规格说明书中山模板建站公司