江苏网站关键词优化优化我想了解怎么开网店
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:39
当前位置: 首页 > news >正文
江苏网站关键词优化优化,我想了解怎么开网店,长沙网页制作,电话推销网站建设前言 JVM是Java项目运行的基础#xff0c;但实际上对它了解知之甚少。一个网站的吞吐量和响应速度#xff0c;其实都跟JVM有重大关系的#xff0c;有时候增加多几台机子#xff0c;还不如优化JVM更实际#xff0c;当然有钱额外另说。 说到JVM调优就肯定跟垃圾回收#…前言 JVM是Java项目运行的基础但实际上对它了解知之甚少。一个网站的吞吐量和响应速度其实都跟JVM有重大关系的有时候增加多几台机子还不如优化JVM更实际当然有钱额外另说。 说到JVM调优就肯定跟垃圾回收GC有关所以首先回顾下GC的发展史。 GC的发展史 JDK1.3 推出串行垃圾回收器Serial GCJDK1.4 推出并行垃圾回收器ParallerGC和并发垃圾回收器CMSJDK1.6 默认并行垃圾回收器JDK1.7 推出G1回收器JDK1.9 默认G1回收器JDK10 G1的并行完整垃圾回收实现并行改善最坏情况的延迟JDK11 引入Espilon GC ,又成为No-Op无操作回收器同时推出ZGC垃圾回收器JDK12 增加G1 自动返回未使用的堆内存给系统,同时推出Shenandoah GCJDK13 增强ZGC自动返回未使用堆内存给系统JDK14 删除CMS扩展ZGC在mac和window使用 总结G1垃圾回收器在JDK1.7就推出截止JDK14还在不断完善相对比目前的ZGC来说还是很成熟的垃圾回收器更别说Espilon GC在JDK11推出之后Espilon GC就没什么动静了。而且如果你有了解过以上全部垃圾回收器的算法G1简直是个宝剑。 JVM调优其实就是看菜吃饭假如内存足够大JVM其实不调优也行但实际上内存都是有限制的所以JVM调优还需要先了解对象的大小。 对象的大小 总结一个空对象的占用的空间大小是16Byte原因是什么先了解基本类型空间大小 基本类型占用空间 基本数据类型占用空间大小(byte)byte1short2int4long8float4doublt8boolean1 对象的构成 一个空对象 Object o new Object(); 空对象组成 对象头(8byte) 类对象指针4byte实例数据0byte 空对象8412 byte - 16 byte 从上面可以看出空对象是12byte但实际上为什么是16byte。 原因涉及到计算机信息存储规范当占用空间不是8的整数倍时该存储信息就会自动补零方便存储和获取。 额外知识点 数组的占用空间大小 数组的组成 对象头(8)类对象指针(4)数组长度实例数据 object[] array {}; 8412 byte - 16 byte int[] array {1,2,3,4}; 8 4 4*4 28byte - 32 byte 示例 以下对象占用空间大小 class AAAAA {} 8412-16class BBBBB {int a 1; } 84416 int是基本数据类型故直接算4class CCCCC {long a 1l; } 84820-24 long是基本数据类型故直接算8class DDDDD {String s Hello; } 84416 String是引用类型故算4 栈(Stack)和堆(Heap) JVM分为栈(Stack)和堆(Heap)-请记住英文单词 图1栈和堆 为什么JVM把内存分成栈和堆 原因 分而治之专门的事专门的人负责栈负责程序的运行堆负责数据的存储但不可以认为栈不能存储数据基础数据类型是放到栈的堆是负责数据的存储那么一些共享的数据都可以放到堆方便栈调用。栈因为是程序运行基础需要保存系统上下文所以进行了地址段划分只能向上增长限制了栈的存储能力。而堆不同堆里的对象会因为程序的运行变成动态增长而栈只需要保存对象在堆的地址对象的引用指针/对象当栈程序运行时需要该对象使用该对象引用地址即可获取该对象内容栈也可以保存数据但保存的是基本数据类型占用的数据空间大小是固定并不会出现动态增加如果对象保存在栈就会容易造成栈内存溢出java.lang.StackOverflowError 常见的内存报错 栈溢出java.lang.StackOverflowError堆溢出java.lang.OutOfMemoryError: Java heap space 持久区溢出java.lang.OutOfMemoryError: PermGen spaceGC为释放很小的空间占用大量的时间java.lang.OutOfMemoryError:GCoverheadlimitexceeded 基本类型已经说完了那么下面说引用类型 引用类型 引用类型分为强引用软引用弱引用虚引用 强引用指栈程序运行时对象是必不可少的时候JVM虚拟机不会回收的对象。打个比喻我们的生活必需品例如衣服手机这些都是必不可少的我们肯定不会回收掉但当衣服手机坏了可以理解为服务器宕机了必需品都坏了不宕机才怪我们就会扔掉回收掉。 // 堆生成对象o同时在栈创建了一个对象引用值占用4byte private Object o ; …. // 栈运行程序引用对象o这个就是强引用 public void demo(Object o){syso(o.toString()); } 软引用当内存不足时才会回收的对象注意垃圾回收和内存不足是两个概念软引用是即使被垃圾回收也不一定会被回收的 软引用又涉及到一个java类SoftReference类使用方法 // 软引用一般配合SoftReference类使用 String s 123; SoftReferenceString softRef new SoftReferenceString(s); 以上写法等于下面 //当内存不足启动垃圾回收时 if(内存不足){s null;//转成软引用System.gc();// 垃圾回收清楚软引用 } 弱引用垃圾回收时回收的对象。 同样也涉及到一个java类WeekReference类使用方法 String s 123; WeakReferenceString softRef new WeakReferenceString(s); System.out.println(sr.get()); System.gc(); //手工模拟JVM的gc进行垃圾回收 System.out.println(sr.get()); //输出为 123 null 虚引用用于跟踪对象被回收的活动的对象 同理也涉及到一个java类PhantomReference类使用方法 Object obj new Object(); ReferenceQueueObject rq new ReferenceQueueObject(); PhantomReferenceObject pf new PhantomReferenceObject(obj,rq); objnull; System.out.println(pf.get());//永远返回null System.out.println(pf.isEnqueued());//返回是否从内存中已经删除 System.gc(); TimeUnit.SECONDS.sleep(6); System.out.println(pf.isEnqueued()); //打印结果 null false true 总结:如下图 基本数据类型、引用数据类型、对象的组成和计算方式都说完接下来说下GC的算法 GC的算法 引用计数法标记清除法复制法标记整理法 引用计算法 顾名思义对象的引用每被引用一次增加一次计数当进行GC时只会删除计数为0的对象 标记清除法 分两个阶段第一阶段遍历所有对象标记被引用的对象第二阶段遍历整个堆会停止整个应用进行GC清除未被标记的对象缺点会出现内存碎片原因没有对内存进行压缩整理。 复制法 把内存分为两个区两个区一模一样同一时间仅使用某个区当进行GC会遍历整个堆内存把正在使用的对象复制到另一个区同时对另一个进行整理压缩优点故不会产生内存碎片。缺点需要的内存空间较大两个区一模一样 标记复制法 就是标记清除法和复制法集合在一起取两者优点。第一阶段遍历对象标记被引用的对象第二遍复制移动被引用的对象且对内存进行整理压缩。优点不需要较大内存不需要停止应用进行GC不会产生内存碎片。 按分区划分 增量收集实时回收垃圾即不停止应用进行垃圾回收分区收集把生命周期不同的对象划分到不同的区年轻区年老区和持久区。不同的区使用不同的算法。JDK1.9之前都是使用该分区收集JDK1.9包含1.9默认使用G1垃圾回收算法 在理解按线程回收区分和收集器区分两个概念前麻烦先搞清楚并行和并发 并行两件或多件事情在同一时间点/某一刻发送注意是时间点/某一刻。打个比方你在吃饭的时候有电话打来你一个人只有一张嘴而这个时间点你只能选择用嘴讲电话或者吃饭。并发两件或多件事情在同一段时段发送注意是一段时间。打个比方你在吃饭的时候有电话打来每一个人只有一张嘴而这个时间段你可以边吃饭边接电话或者先吃饭后接电话或先接电话再吃饭但每一个时间点你只能用嘴做一件事。 按线程回收 线程分为用户线程和垃圾回收线程 串行收集使用单条垃圾回收线程回收垃圾所有用户线程处于等待状态SWT情况并行收集使用多条垃圾回收线程并行处理所有用户线程处于等待状态SWT情况并发收集垃圾回收线程和用户线程同时进行他们运行在不同的CPU上并不一定是并行有可能是交替不会造成SWT情况 按收集器 1.串行收集器 使用单线程回收垃圾会暂停应用进行GC简称SWT 使用场景数据量少的应用且对响应时间无要求的应用 开启方式-XX:UseSerialGC 从上图可知串行垃圾回收器使用的标记清除法算法但会压缩整理内存故不会产生内存碎片 2.并行收集器 使用多线程回收垃圾会暂停应用进行GC 使用场景吞吐量高且对响应时间无要求的应用,简称SWT 开启方式-XXUseParalleGC 额外补充 -XX:UseOldParalleGC:年老区开启并行收集JDK1.6之后才可以使用 -XX:MaxGCPauseMilliesn:最大垃圾回收暂停时间单位毫秒 -XX:MaxParalleThreadsn并行垃圾回收线程n一般等于处理器数量CPU -XX:GCTimeRation设置垃圾回收时间与非垃圾回收时间比例程序正常运行时间公式是1/(1n),例如n19那么时间占比是5% 上图可知并行收集器使用的标记清楚算法但同时也使用了串行线程来执行但1.6之后可以开启并行线程处理 3.并发收集器 可以保证运行大部分时间都是正常工作垃圾回收时间只是占用很低。且不会暂停应用进行GC。但有缺点下面再说 使用场景对响应时间有要求的应用 开启方式 -XX:UseConcMarkSweep开启并发收集器CMS主要针对年老区进行内存压缩整理 额外补充 -XX:MaxGCPauseMillis同上 -XX:CMSFullGCBeforen ,设置FullGC后对年老代进行压缩整理 -XX:CMSInitiatingOccupancyFraction,开启剩余多少堆内存开启并发收集 -XX:CMSIncreamentModel:设置为增量模式适合单CPU。 缺点造成浮点垃圾 它的优点正是它产生缺点的原因由于它不会暂停应用回收垃圾所以应用是边正常运行边进行垃圾回收这段时间内肯定会产生新的垃圾但前一刻垃圾回收已进行完毕这部分新的垃圾只能等到下次垃圾回收进行回收。这些垃圾称为浮点垃圾。 上图可知并行垃圾回收器内部其实也是使用着并行线程但它并发的处理了垃圾回收但没有整理压缩内存。 4.G1垃圾回收器 G1垃圾回收器是JDK1.7推出JDK1.9默认成为垃圾回收器 存在目的是 1.更简单配置JVM只需要通过是三个设置 1. 开启G1回收器-XX:Use G1 2. 设置堆内存大小:-Xms -Xmx 3. 配置垃圾回收停顿时间:-XX:MaxGCPauseMillils 2. 优化垃圾回收器 概念取消了年轻区、年老区和元空区的物理划分相对应的把堆内存划分成一个个区Region每个区默认值512K每个区有可能是年老区年轻区元空区或者巨型区。同时每个区都会存在一个RSet集合。两个重要单词区Region和集合RSet 巨型区Humongous简称H区 有时候对象占用的空间过大占用该区的50%以上当GC时该对象会直接复制到年老区但如果该对象生命周期短那么也会对年老区造成负面影响占用空间大容易使年老区空间满生命周期短又需要多次进行GC所以为了解决该问题就创建一个H区专门存放这些对象。 如下图 RSet集合 每个区Region创建的时候同时会划分成多个Card同时会对应生成一个RSet的集合上文说过对象里通常会含有另一个对象该对象所在Region区为了跟踪记录其他区(Region)被引用的对象这是用就要使用RSet记录被引用对象的地址记录形式为XXRegion的XXCard如下图 三个垃圾回收模式 G1垃圾回收器又分为三个垃圾回收模式
- Young GC
- Mixed GC
- FULL GC Young GC G1的年轻区的垃圾回收还是会暂停应用实现垃圾回收它会把存回的对象复制到Survivor区或者年老区类似复制法但不需要两个相同的内存区不会产生内存碎片 年老区的垃圾回收采用并发收集器采用标记整理法会产生内存碎片。 Mixed GC 当越来越多对象升级到年老区年老区的占比达到45%默认值为了避免堆内存被耗尽和频繁调用FULL GC就产生改回收模式该回收模式除了回收年轻区还会回收部分年老区注意是部分不是全部 开启方式-XX:InitatingHeapOccupancyPerentn FULL GC 没啥好说的了就是停止整个应用扫描整个堆标记清除所有垃圾 额外补充 -XX:UseG1GC 使用G1GC -XX:MaxGCPauseMillis,GC回收时间的设置默认是200毫秒 -XX:G1HeapRegionSizen 设置G1区域大小值是2的幂数范围在1M到32M之间默认是堆内存的1/2000 -XX:ParalleGCThreadsn -XX:ConcGCTreadsn 设置并行标记的线程数n设置为并行垃圾回收线程数ParallerTreads的1/4 -XX:InitiatingHeapOccupanyPerentn 设置触发标记周期的java堆占用阈值默认占堆45% 垃圾回收算法垃圾回收线程垃圾收集器三个概念已学习完毕那么这三者怎么串联起来呢 简单总结不同的垃圾收集器使用不同的垃圾回收线程在不同的区使用不同的垃圾回收算法 上面这句话很绕口配合下面表格就可以很简单的理解 回收器名称能回收器类型算法作用位置区特点使用场景SerialGC串行垃圾回收器复制法年轻区相应速度快适合单核的客户端应用程序已被淘汰SerialOldGC串行垃圾回收器标记清除法年老区响应速度快适合单核的客户端的应用程序已被淘汰ParNew并行垃圾回收器复制法年轻区响应速度快适合后端多CPU默认搭配CMS一起使用ParalleGC并行垃圾回收器复制法年轻区吞吐量高适合后端多CPU堆内存不是很大的应用程序ParalleOldGC并行垃圾回收法标记清除法年老区吞吐量高适合后端多CPU堆内存不是很大的应用程序CMS并发垃圾回收器标记清除法年老区响应速度快大型企业应用G1并行/并发垃圾回收器复制法/标记整理法年轻区/年老区响应速度快大型企业应用 垃圾回收器的搭配使用 基本准则 年轻区与年老区串行配串行并行配串行并行配并行并行配并发G1很特殊 如下图 问题集锦 如何区分垃圾 无法被引用的对象就被当做垃圾进行回收。 怎么寻找垃圾 上文也说过栈是程序运行的地方堆是存储数据的地方要寻找垃圾无法被引用的对象当然要从栈开始以栈中的对象为根节点逐步查询被引用的对象如果被引用的对象也含有其他被引用的对象以这个被引用的对象为枝节点继续查询被引用的对象如此循环…..如下图 内存碎片 上文提到过标记整理法会造成内存碎片看下图堆存放数据的空间不一定要摆放在上一个数据的隔壁是根据数据存储的规范而存储数据的。这样就会造成垃圾回收完毕后剩余的堆空间不足以摆放其他对象两个数据之间不能存放数据。 如何解决同时解决垃圾回收和创建对象的问题 垃圾回收是为了让回收内存创建对象是分配内存的两者是矛盾的最好的解决办法。创建对象时停止垃圾回收或者垃圾回收时禁止创建对象。例如引用计数法标记清除法。 为什么分代 堆内存分为年轻代年老代和持久代。每个对象的生命周期都不一致生命周期短的对象可以直接在年轻代被回收这样就可以减少垃圾回收的次数。 为什么对象占用空间一定是8的倍数 根据计算机存储信息规范为了方便读取和存储数据当数据信息占用空间不是8的倍数时会自动补零。https://www.zhihu.com/question/375626478 什么是内存碎片 内存碎片分为 内部碎片已分配给当前线程的内存存在当前线程不能使用的内存 外部碎片未分配给任何线程的内存大小不足以供任意线程使用 堆内存碎片同理内部碎片当堆剩余内存空间且没有整理压缩过导致不足以存放对象。https://blog.csdn.net/qq_43012792/article/details/107501545 线程与进程的关系 打个比喻进程好比火车线程好比火车的每节车厢一个进程可以有多个线程。 但每个进程是互不影响的但线程之间可以互相影响的。火车之间是不会影响到他们的行驶路线的但每节火车之间的食物、饮料和服务员是可以共享的。 为什么说程序运行可以没有堆但不能没有栈 说白了堆只是存储数据的地方栈其实也可以保存数据但如果保存数据量大的数据就会严重影响程序的运行所以就把内存分成栈和堆 施工完毕下一篇JVM调优案例篇 参考文章 JVM调优总结https://www.cnblogs.com/andy-zhou/p/5327288.html#_caption_0 JVM垃圾回收器的发展历程及使用场景汇总https://www.jianshu.com/p/9916ae406f56 JVM 调优实战–垃圾收集器串行、ParNew并行、ParallelNew并行、CMS、G1https://zhangxueliang.blog.csdn.net/article/details/104004153 额外知识点 不同的JDK区的划分和叫法不同 堆内存年轻区、年老区、持久区 JDK1.8和1.8之后 堆内存年轻区、年老区、元空区 G1之后 堆内存划分成一个个region区每个区都有可能是年轻区年老区元空区和巨型区 传统GC回收流程
相关文章
-
江苏网站seo设计建设简易电子商务网站流程图
江苏网站seo设计建设简易电子商务网站流程图
- 技术栈
- 2026年03月21日
-
江苏天目建设网站房屋设计图纸平面图
江苏天目建设网站房屋设计图纸平面图
- 技术栈
- 2026年03月21日
-
江苏天目建设网站WordPress自学建网站
江苏天目建设网站WordPress自学建网站
- 技术栈
- 2026年03月21日
-
江苏网站建设 seo注册会计师报考条件和时间2023
江苏网站建设 seo注册会计师报考条件和时间2023
- 技术栈
- 2026年03月21日
-
江苏网站建设yijuce微信的定制开发
江苏网站建设yijuce微信的定制开发
- 技术栈
- 2026年03月21日
-
江苏网站建设方案开发一个区块链app多少钱
江苏网站建设方案开发一个区块链app多少钱
- 技术栈
- 2026年03月21日
