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

赣州市网站建设公司著名logo设计案例

赣州市网站建设公司,著名logo设计案例,WordPress页面加分类文章,长春工作招聘网一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆#xff0c;从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间#xff0c;老年代默认占2/3堆内存空间#xff0c;永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和Surv…一、说一说JVM的内存模型。JVM的运行时内存也叫做JVM堆从GC的角度可以将JVM分为新生代、老年代和永久代。其中新生代默认占1/3堆内存空间老年代默认占2/3堆内存空间永久代占非常少的对内存空间。新生代又分为Eden区、SurvivorFrom区和SurvivorTo区 Eden区默认占8/10新生代空间SurvivorFrom区和SurvivorTo区默认分别占1/10新生代空间Eden区最小占3/5新生代空间SurvivorFrom区和SurvivorTo区分别占1/5新生代空间如下图所示永久代 永久代指内存的永久保存区域主要存放Class和Meta元数据的信息。Class在类加载时被放入永久。永久代和老年代、新生代不同GC不会在程序运行期间对永久代的内存进行清理这也导致了永久代的内存会随着加载的Class文件的增加而增加在加载Class文件过多时会抛出Out Of Memory异常比如Tomcat引用Jar文件过多会导致JVM内存不足而无法启动。 需要注意的是在Java 8 中永久代已经被元数据区也叫做元空间取代。元数据区的作用和永久代类似二者最大的区别在于元数据区并没有使用虚拟机内存而是直接使用操作系统的本地内存。因此元空间的大小不受JVM内存的限制之和操作系统的内存有关。 在Java 8 中JVM将类的元数据放入本地内存Native Memory中将常量池和类的静态变量放入Java堆中这样JVM能够加载多少元数据信息就不再由JVM的最大可用内存MaxPermSize空间决定而由操作系统的实际可用的内存空间决定。原文链接https://blog.csdn.net/qq_45886144/article/details/124083079二、JAVA类加载的全过程是怎样的什么是双亲委派机制有什么作用JAVA的类加载器 AppClassloader - ExtClassloader - BootStrap Classloader每种类加载器都有他自己的加载目录。JAVA中的类加载器 AppClassLoader , ExtClassLoader - URLClassLoader -SecureClassLoader - ClassLoader每个类加载器对他加载过的类都是有一个缓存的。双亲委派向上委托查找向下委托加载。 作用保护JAVA的层的类不会被应用程序覆盖。类加载过程 加载 -》 连接 -》 初始化加载把Java的字节码数据加载到JVM内存当中并映射成JVM认可的数据结构。连接分为三个小的阶段 1、验证检查加载到的字节信息是否符合JVM规范。 2、准备 创建类或接口的静态变量并赋初始值 半初始化状态 3、解析把符号引用转为直接引用初始化一个对象从加载到JVM再到被GC清除都经历了什么过程method{ ClassLoaderDemo1 c new ClassLoaderDemo1(); c.xxx} GC 1、用户创建一个对象JVM首先需要到方法区去找对象的类型信息。然后再创建对象。2、JVM要实例化一个对象首先要在堆当中先创建一个对象。- 半初始化状态3、对象首先会分配在堆内存中新生代的Eden。然后经过一次Minor GC对象如果存活就会进入S区。在后续的每次GC中如果对象一直存活就会在S区来回拷贝每移动一次年龄加1。- 多大年龄才会移入老年代 年龄最大15 超过一定年龄后对象转入老年代。4、当方法执行结束后栈中的指针会先移除掉。5、堆中的对象经过Full GC就会被标记为垃圾然后被GC线程清理掉。三、怎么确定一个对象到底是不是垃圾 什么是GC Root?有两种定位垃圾的方式1、引用计数 这种方式是给堆内存当中的每个对象记录一个引用个数。引用个数为0的就认为是垃圾。这是早期JDK中使用的方式。引用计数无法解决循环引用的问题。2、根可达算法 这种方式是在内存中从引用根对象向下一直找引用找不到的对象就是垃圾。哪些是GC Root Stack - JVM Stack, Native Stack class类 run-time constant pool 常量池 static reference 静态变量。四、JVM有哪些垃圾回收算法GC是什么分代收集算法次数上频繁收集Young区 Minor GC次数上较少收集Old区 Full GC基本不动Perm区垃圾回收机制的算法java语言规范没有明确的说明JVM 使用哪种垃圾回收算法但是任何一种垃圾回收算法一般要做两件基本事情1发现无用的信息对象2回收将无用对象占用的内存空间使该空间可被程序再次使用。1、判断对象是否需要被回收一般是两种算法引用计数器算法和可达性算法。1.1 引用计数器算法原理其实很简单给运行的对象添加一个引用计数器每当有一个地方引用它时计数器1当引用失效时计数器就-1任何时刻计数器为0的对象就视作不可能再被使用。这一种方式实现简单逻辑也清晰大部分的情况下它都可以达到很好的效果尽管这样计数器算法还是存在但是的但是它无法解决循环引用的场景这也是主流Java虚拟机没有选用这一算法的原因。1.2 可达性算法此算法的核心思想通过一系列称为“GC Roots”的对象作为起始点从这些节点开始向下搜索搜索走过的路径称为“引用链”当一个对象到 GC Roots 没有任何的引用链相连时(从 GC Roots 到这个对象不可达)时证明此对象不可用。2、回收清理使用发现算法垃圾被标记后接下来就是如何去清除常见的清除算法有标记清除法、复制清除、标记整理算法、分代收集其中当前主流使用的是分代收集。2.1 Mark Sweep 标记清除算法这种算法是比较简单的分为两个阶段标记阶段通过可达性分析方法把垃圾内存标记出来清除阶段直接将垃圾内存回收。简单粗暴即标记删除的对象对其进行内存回收。但是有个很严重的问题就是一段时间后内存会出现大量碎片导致虽然碎片总和很大但无法满足一个大对象的内存申请从而导致 OOM而过多的内存碎片需要类似链表的数据结构维护也会导致标记和清除的操作成本高效率低下。缺点两次扫描耗时严重会产生内存碎片。2.2 MarkCompack 标记压缩算法为了解决拷贝算法的缺陷就提出了标记压缩算法。这种算法在标记阶段跟标记清除算法是一样的只是在标记清除的基础上追加了碎片的散落问题在清除之后进行了碎片的整理但副作用是增了了GC的时间。2.3 Copying 复制算法为了解决标记清除算法的效率问题有人提出了复制算法。它将内存分为大小相等的两半每次只使用其中一半。垃圾回收时将当前这一块的存活对象全部拷贝到另一半然后当前这一半内存就可以直接清除。这种算法高效的原因在于分配内存时只需要将指针后移不需要维护链表等。但它最大的问题是对内存的浪费使用率只有 50%。但这种算法在一种情况下会很高效Java 对象的存活时间极短。据 IBM 研究Java 对象高达 98% 是朝生夕死的这也意味着每次 GC 可以回收大部分的内存需要复制的数据量也很小这样它的执行效率就会很高。优点没有标记和清除的过程效率高没有内存碎片可以利用bump-the-pointer实现快速内存分配。缺点需要双倍空间。这三种算法各有利弊各自有各自的适合场景。2.4 分代收集Generation Collection在实际的Java程序中大部分的对象存活周期都较短基本上创建完紧接着处理完数据就被丢弃了大部分 Java 对象是朝生夕死的所以我们将内存按照 Java 生存时间分为 新生代(Young) 和 老年代(Old)前者存放短命僧后者存放长寿佛当然长寿佛也是由短命僧升级上来的。然后针对两者可以采用不同的回收算法比如对于新生代采用复制算法会比较高效而对老年代可以采用标记-清除或者标记-整理算法。这种算法也是最常用的。JVM Heap 分代后的划分一般如下所示新生代一般会分为 Eden、Survivor0、Survivor1区便于使用复制算法。将内存分代后的 GC 过程一般类似下图所示对象一般都是先在 Eden区创建当Eden区满触发 Young GC此时将 Eden中还存活的对象复制到 S0中并清空 Eden区后继续为新的对象分配内存当Eden区再次满后触发又一次的 Young GC此时会将 Eden和S0中存活的对象复制到 S1中然后清空Eden和S0后继续为新的对象分配内存每经过一次 Young GC存活下来的对象都会将自己存活次数加1当达到一定次数后会随着一次 Young GC 晋升到 Old区Old区也会在合适的时机进行自己的 GC五、JVM有哪些垃圾回收器他们都是怎么工作的什么是STW他都发生在哪些阶段什么是三色标记如何解决错标记和漏标记的问题为什么要设计这么多的垃圾回收器STW: Stop-The-World。是在垃圾回收算法执行过程当中需要将JVM内存冻结的一种状态。在STW状态下JAVA的所有线程都是停止执行的-GC线程除外native方法可以执行但是不能与JVM交互。GC各种算法优化的重点就是减少STW同时这也是JVM调优的重点。JVM的垃圾回收器Serial 串行整体过程比较简单就像踢足球一样需要GC时直接暂停GC完了再继续。这个垃圾回收器是早期垃圾回收器只有一个线程执行GC。在多CPU架构下性能就会下降严重。只适用于几十兆的内存空间。Parallel 并行在串行基础上增加多线程GC。PSPO这种组合是JDK1.8默认的垃圾回收器。在多CPU的架构下性能会比Serial高很多。CMS Concurrent Mark Sweep核心思想就是将STW打散让一部分GC线程与用户线程并发执行。 整个GC过程分为四个阶段1、初始标记阶段STW 只标记出根对象直接引用的对象。2、并发标记继续标记其他对象与应用程序是并发执行。3、重新标记 STW 对并发执行阶段的对象进行重新标记。4、并发清除并行。将产生的垃圾清除。清除过程中应用程序又会不断的产生新的垃圾叫做浮动垃圾。这些垃圾就要留到下一次GC过程中清除。G1 Garbage First 垃圾优先他的内存模型是实际不分代但是逻辑上是分代的。在内存模型中对于堆内存就不再分老年代和新生代而是划分成一个一个的小内存块叫做Region。每个Region可以隶属于不同的年代。GC分为四个阶段第一初始标记 标记出GCRoot直接引用的对象。STW第二标记Region通过RSet标记出上一个阶段标记的Region引用到的Old区Region。第三并发标记阶段跟CMS的步骤是差不多的。只是遍历的范围不再是整个Old区而只需要遍历第二步标记出来的Region。第四重新标记 跟CMS中的重新标记过程是差不多的。第五垃圾清理与CMS不同的是G1可以采用拷贝算法直接将整个Region中的对象拷贝到另一个Region。而这个阶段G1只选择垃圾较多的Region来清理并不是完全清理。CMS的核心算法就是三色标记。三色标记是一种逻辑上的抽象。将每个内存对象分成三种颜色 黑色表示自己和成员变量都已经标记完毕。 灰色自己标记完了但是成员变量还没有完全标记完。白色自己未标记完。CMS通过增量标记 increment update 的方式来解决漏标的问题。六、如何进行JVM调优怎么查看一个JAVA进程的JVM参数谈谈你了解的JVM参数。如果一个java程序每次运行一段时间后就变得非常卡顿你准备如何对他进行优化JVM调优主要就是通过定制JVM运行参数来提高JAVA应用程度的运行数据。JVM参数有哪些JVM参数大致可以分为三类1、 标注指令 -开头这些是所有的HotSpot都支持的参数。可以用java -help 打印出来。2、非标准指令 -X开头这些指令通常是跟特定的HotSpot版本对应的。可以用java -X 打印出来。3、不稳定参数 -XX 开头这一类参数是跟特定HotSpot版本对应的并且变化非常大。详细的文档资料非常少。在JDK1.8版本下有几个常用的不稳定指令 java -XX:PrintCommandLineFlags 查看当前命令的不稳定指令。java -XX:PrintFlagsInitial 查看所有不稳定指令的默认值。java -XX:PrintFlagsFinal 查看所有不稳定指令最终生效的实际值。
http://www.dnsts.com.cn/news/29768.html

相关文章:

  • 如何做建材网站的线下推广怎么做动漫原创视频网站
  • 长沙电子商务网站建设下面什么不是用于制作网页的软件
  • 静态页面做网站wordpress 登陆重定向
  • 东莞做网站排名wordpress注册用户上传权限
  • 电白网站建设网上商城取名
  • app和网站哪个有优势毕业设计做网站有哪些方面
  • 有关网站建设国内外现状的文献彩票网站怎么建设
  • 平台网站建设合同纹身网站建设案例
  • 一个服务器上建立多个网站吗昆明专业建站
  • 做彩票网站是违法wordpress授权破解
  • 莱芜手机网站设计公司公众号编辑器免费模板
  • 怎么做免费的网站链接wordpress产品展示插件
  • 网站建设合同以及服务条款哪个网站可以看一级a做爰片t
  • 凡科网做网站怎么样吉林网站建设方案
  • 香山网站建设国外免费空间网站申请
  • 广州个人做网站商城网站建设特点
  • 人工智能自动做网站个人怎么注册公司需要多少钱
  • 网站做中秋专题怎么弄佛山专业网站设计方案
  • 外贸中间体做哪个网站好沛县网站建设xlec
  • 有没有网站开发团队制作ppt的软件免费下载
  • 凡客建站中小企业管理软件排名
  • 驻马店重点项目建设网站wordpress实现更多
  • 惠州惠阳网站建设网站开发岗位介绍
  • 网站免费正能量不下载建设银行信用卡积分兑换商城网站
  • 温州网站 公司wordpress 企业 模板
  • 手机版网站公司的做犯法任务的网站
  • phpcms律师网站模板微信公众号免费模板素材网站
  • 代做财务报表分析网站全球访问量最大的网站排名
  • 做自媒体的素材网站seo互联网营销培训
  • 佛山网站优化体验wordpress php环境搭建