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

网站的数据库怎么做滨州做微商城网站

网站的数据库怎么做,滨州做微商城网站,新业务在线软件下载,网站建设的相关新闻作者 | Craig无忌来源 | 程序员大帝#xff08;ID:kingcoding#xff09;前言回收#xff0c;旧手机#xff0c;旧冰箱#xff0c;旧空调#xff0c;旧洗衣机#xff0c;电瓶车摩托车#xff0c;自行车#xff0c;报纸#xff0c;塑料......还记得小时候#xff0c;… 作者 | Craig无忌来源 | 程序员大帝ID:kingcoding前言回收旧手机旧冰箱旧空调旧洗衣机电瓶车摩托车自行车报纸塑料......还记得小时候我喝完的饮料瓶子都不会扔每次都放到阳台。小区里听到收废品的吆喝感觉带着这些瓶瓶罐罐冲下楼换几块钱买雪糕想想都是童年的回忆啊。我一直都觉得骑个三轮车回收废品的大爷特别酷因为感觉他的车上面就像哆啦A梦的口袋翻一翻什么都有。不过这些年随着垃圾分类感觉收废品的大爷也越来越少了。回过头想如果没有这些收废品的大爷那我攒的瓶子也卖不了钱家里阳台那么多瓶子还占地方。所以你大爷就是你大爷主动过来帮你清理垃圾还给你钱。所以为什么 Java 越来越流行除了说它一处安装到处运行的机制以外。还因为程序员也越来越懒跟 C/C 相比Java 最适合懒人的便是引入了自动垃圾回收的机制也就是Garage Collection下文简称 GC 。网上对于 Java 垃圾回收的介绍堪称冠冕堂皇让程序员专注于程序本身不用关心内存回收这些恼人的问题真正让程序员的生产力得到了释放程序员不用感知到它的存在。说这么多不就是程序员懒么 Java 直接帮你把脏活累活都干了。就像咱们现在人都爱点外卖为什么因为不用自己动手吃完也不用洗碗。还有你去餐盘吃饭吃完就走服务员会替你收拾好这些餐盘你不会关心服务员什么时候来收怎么收。大家可能会说既然 Java 这么方便已经帮我们完成了对垃圾的清理与回收那 GC 方面的知识我不用了解好像也没事吧。但是人有失手马有失蹄假如突然有一天外卖小哥带着你的外卖小哥跑路了你必须要亲自动手下厨总不能饿死吧。所以对于 GC道理也是一样的线上的服务不遇到问题还好出现 Bug 或者想自己做一些性能调优的时候就需要对 GC 有深入了解才可以这也是成为一名优秀 Java 程序员的必修课今天就把 JVM GC 相关的知识详细介绍一下本文将会从以下几个方面来讲述相关知识文字较多相信大家耐心看了之后肯定有收获码字不易别忘了「在看」「转发」哦。JVM 内存区域回收策略垃圾回收经典算法垃圾回收器对比JVM 内存区域我们首先要知道垃圾回收主要回收的是哪些数据这些数据主要在哪一块区域所以我们一起来看下 JVM 的内存区域。JDK8以前在JDK8之前的虚拟机主要包含1堆对象实例和数组都是在堆上分配的GC 也主要对这两类数据进行回收这里是 GC 发生的主要区域2方法区永久代方法区在 JVM 中是一个非常重要的区域它与堆一样是被线程共享的区域。在方法区中存储了每个类的信息包括类的名称、方法信息、字段信息、静态变量、常量以及编译器编译后的代码等。方法区是堆的一个逻辑部分为了区分Java堆它还有一个别名 Non-Heap非堆。相对而言GC 对于这个区域的收集是很少出现的。当方法区无法满足内存分配需求时将抛出 OutOfMemoryError 异常。随着动态类加载的情况越来越多这块内存越来越不太可控。如果设置小了当JVM加载的类信息容量超过了这个值系统运行过程中就容易出现内存溢出 OOM:PermGen 的错误设置大了又浪费内存。3栈栈是线程私有的生命周期与线程相同主要保存执行方法时的局部变量表、操作数栈、动态连接和方法返回地址等信息。这块区域是不需要进行 GC 的。4程序计数器程序计数器也是线程私有的它里面记录了下一次需要执行的行号这块区域也不需要进行 GC。5本地方法栈本地方法栈主要为了虚拟机执行 Java 的本地方法 Native Method时服务这块区域也不需要进行 GC。JDK8之后JDK8 最大的变化就是对 JVM 内存空间进行了改造主要的区别是将方法区进行了移除并新增了元空间元空间是放置在 JVM 内存空间之外的直接内存中并且 JDK8 中对于方法区的参数 PermSize 和 MaxPermSize 已经失效。上文咱们已经介绍过JDK8 之前方法区放在 JVM 之中但是随着动态类加载的情况越来越多很容易因为大小的限制导致内存溢出 OOM:PermGen 的错误。所以JDK8 之后把使用元空间替代了原来的方法区在这种架构下元空间就突破了原来-XX:MaxPermSize 的限制。这样就从一定程度上解决了原来在运行时生成大量类造成经常 Full GC 问题如运行时使用反射、代理等所以升级以后Java堆空间可能会增加。垃圾回收策略凡事都讲解个策略那么 Java 怎么判断堆中的对象实例或数据是不是垃圾呢应不应该把它回收掉呢引用计数法第一种最简单粗暴的就是引用计数法。当对象被引用程序计数器 1释放时候 -1当为 0 时证明对象未被引用可以回收。但是这个算法有明显的缺陷对于循环引用的情况下循环引用的对象就不会被回收。例如下图对象 A对象 B 循环引用没有其他的对象引用 A 和 B则 A 和 B 都不会被回收。可达性分析第二种策略明显好的多也就是所谓可达性分析法。它指的通过一系列称之为“GC Roots” 的对象作为起点从此起点向下搜索所走过的路径称之为引用链当一个对象到 GC Roots 没有任何引用链相连接代表此对象不可达。在 Java 可以作为GC Roots 的对象包括1、虚拟机栈帧栈中的局部变量表中的引用对象2、方法区中类静态属性引用的对象3、方法区中常量引用的对象4、本地方法栈中JNI (即一般说的 Native 方法) 的引用对象画外音GC Roots有哪些这个问题经常在面试中被问到大家一定牢记垃圾回收经典算法知道了应该对哪些对象进行回收那接下来就要看如何回收了经典的垃圾回收算法有三种。标记 - 清除算法在gc时候首先扫描时对需要清理的无用对象进行标记然后将这些对象直接清理。操作起来非常很简单但仔细想想有什么问题呢没错内存碎片如上图如果清理了两个 1kb 的对象再添加一个 2kb 的对象是无法放入这两个位置的。怎么解决呢如果能把这些碎片的内存连起来就可以了标记 - 整理算法标记 - 整理算法就是在标记 - 清理算法的基础上多加了一步整理的过程把空闲的空间进行上移从而解决了内存碎片的问题。但是缺点也很明显每进一次垃圾清除都要频繁地移动存活的对象效率十分低下。复制算法复制算法是将空间一分为二在清理时将需要保留的对象复制到第二块区域上复制的时候直接紧凑排列然后把原来的一块区域清空。不过复制算法的缺点也显而易见本来 JVM 堆假设有 100M 内存结果由于将空间一分为二真正能用的变成只有 50M 了这肯定是不能接受的另外每次回收也要把存活对象移动到另一半效率低下。分代算法分代收集算法整合了以上算法综合了这些算法的优点最大程度避免了它们的缺点。与其说它是算法倒不是说它是一种策略因为它是把上述几种算法整合在了一起我们先从下图看看对象的生存规律。由图可知大部分的对象都很短命一般来说98% 的对象都是朝生夕死的所以分代收集算法根据对象存活周期的不同将堆分成新生代和老生代。新生代和老年代的默认比例为 1 : 2新生代又分为 Eden 区 from Survivor 区简称 S0 to Survivor 区(简称 S1 )三者的比例为 8: 1 : 1。根据新老生代的特点选择最合适的垃圾回收算法我们把新生代发生的 GC 称为 Young GC也叫 Minor GC ,老年代发生的 GC 称为 Old GC也称为 Full GC 。大多数情况下对象在新生代 Eden区中分配。当 Eden 区没有足够空间进行分配时虚拟机将发起一次 MinorGCMinor GC 非常频繁一般回收速度也比较快出现了 Full GC经常会伴随至少一次的 Minor GCFull GC 的速度一般会比 Minor GC 慢10倍以上。    整个过程大致分为以下几个步骤1当 Eden 满了后进行 Minor GC将需要保存的数据复制到 S0 中2然后清空 Eden 和 S1 区域需要保留的对象目前在 S0 中3下一次当 Eden 满了后进行Minor GC将原来 S0 存在的数据复制到S1中将 Eden 中需要保存的数据也复制到 S1 中4清空 Eden 和 S0 区域需要保存的对象目前都在 S1 中5EdenS0 复制到 S16EdenS1 复制到 S07EdenS0 复制到 S1周而复始...垃圾回收器对比前面的内容更多的是方法论真正执行垃圾回收的要靠各个垃圾回收器。Java虚拟机规范并没有规定垃圾收集器应该如何实现因此一般来说不同厂商不同版本的虚拟机提供的垃圾收集器实现可能会有差别一般会给出参数来让用户根据应用的特点来组合各个年代使用的收集器主要有以下几种垃圾收集器。Serial收集器从名字看出这是一个单线程收集器。串行垃圾回收器在进行垃圾回收时它会持有所有应用程序的线程冻结所有应用程序线程使用单个垃圾回收线程来进行垃圾回收工作。它是 JDK1.3 之前新生代的回收器的唯一选择在单线程的情况效果很好因为单线程没有线程的切换的开销。但是在现在大部分都是多 CPU 的服务器所以它现在被使用的很少了。但是它还是 JVM 运行在 Client 模式下的默认垃圾收集器。因为一般桌面应用下新生代空间不是很大使用这个垃圾回收器也可以保证回收的时间在 100 毫秒左右。Serial-Old收集器这个收集器就是 serial 收集器的老年版本他同样还是单线程的垃圾回收器。它存在的主要意义的还是 JVM 运行在 client 模式下的默认老年代回收器跟 serial收集器一起使用同样它还作为 CMS 垃圾回收器的后备垃圾回收器。ParNew收集器ParNew 垃圾收集器就是 serial 回收器的多线程版本有很多的代码都是和 serial 收集器公用的。一个很重要的作用就是作为新生代的垃圾回收器跟 CMS垃圾回收器进行组合。但是在单核 CPU 的情况下效率是没有 serial 垃圾回收器的效果好的。可以通过-XX:UseConcMarkSweepGC 或者-XX:UseParNewGC 来指定使用它。默认情况它用于回收垃圾的线程的数目跟 CPU 的数目相同。可以通过-XX:parallelGCThreads 来指定使用的垃圾回收的线程的数目。Parallel Scavenge收集器与 ParNew 线程一样同样为多线程的垃圾回收器但是这个垃圾回收器和其他回收器的关注点不同。其他的垃圾回收器是尽可能缩短垃圾回收时对用户线程的缩短时间。但是这个垃圾回收器关注的是一个吞吐量的概念。吞吐量指的是运行用户代码的时间/运行用户代码时间垃圾回收时间。缩短用户停顿时间对那些高交互性比如一些 web 项目看中的。而吞吐量是一些运行在后台的计算任务是看重的。Parallel Old收集器这个回收器是 Parallel scavenge 的老年代版本经常和 Parallel scavenge 一起使用在对内存比较敏感和对吞吐量比较高的场合下使用使用多线程和“标记整理”算法。这个收集器是在JDK 1.6 中才开始提供CMS收集器划重点CMS Concurrent Mark Sweep 收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或 B/S 系统的服务端上这类应用尤其重视服务的响应速度希望系统停顿时间最短以给用户带来较好的体验。CMS 基于“标记-清除”算法实现的整个过程分为 4 个步骤包括1初始标记只标记根节点直接关联的引用对象需要暂停用户线程时间短2并发标记标记其他引用对象可以跟用户线程并发同时执行3重新标记暂停用户线程对并发标记期间新增加的引用关系变化再次标记时间短4并发清除跟用户线程并发进行。其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下 GC Roots 能直接关联到的对象速度很快并发标记阶段就是进行 GC Roots Tracing 的过程而重新标记阶段则是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录这个阶段的停顿时间一般会比初始标记阶段稍长一些但远比并发标记的时间短。由于整个过程中耗时最长的并发标记和并发清除过程中收集器线程都可以与用户线程一起工作所以总体上来说CMS 收集器的内存回收过程是与用户线程一起并发地执行。CMS 收集器已经在很大程度上减少了用户线程的停顿时间但是他也存在下面三个主要的缺点1跟用户线程竞争资源CMS 默认的并发线程数目为CPU 数目3/4,当 CPU 线程大于 4 的时候CMS 垃圾收集器至少要占用 25% 的资源。当小于 4 的时候占用 CPU 资源更加明显。2无法清除浮动垃圾当收集器在进行并发清除垃圾的时候由于用户线程还在执行要预留一定的空间给用户线程进行使用所以收集器一定不能在老年代已经占用 100% 的情况下再进行垃圾收集。3内存碎片因为这个垃圾回收器是使用的标记-清除算法所以会产生大量的内存碎片。有两个值可以进行控制-XX:UseCMSCompactAtFullCollection 默认开启来指定需要 FULL GC 时会对内存空间进行一次整理。-XX:CMSFullGCsBeforeCompaction 来指定多少次不整理之后进行一次整理。G1收集器划重点G1 是目前技术发展的最前沿成果之一HotSpot 开发团队赋予它的使命是未来可以替换掉JDK1.5中发布的CMS收集器。与CMS 收集器相比 G1 收集器有以下特点1空间整合G1 收集器采用标记-整理算法不会产生内存空间碎片。分配大对象时不会因为无法找到连续空间而提前触发下一次 GC。2可预测停顿这是 G1 的另一大优势降低停顿时间是 G1 和 CMS 的共同关注点但 G1 除了追求低停顿外还能建立可预测的停顿时间模型。能让使用者明确指定在一个长度为 N 毫秒的时间片段内消耗在垃圾收集上的时间不得超过 N 毫秒这几乎已经是实时垃圾收集器的特征了。上面提到的垃圾收集器收集的范围都是整个新生代或者老年代而 G1 不再是这样。使用 G1 收集器时Java 堆的内存布局与其他收集器有很大差别它将整个Java堆划分为多个大小相等的独立区域Region虽然还保留有新生代和老年代的概念但新生代和老年代不再是物理隔阂了它们都是一部分可以不连续 Region 的集合。本文介绍了 JVM 垃圾回收的原理与垃圾收集器的种类相信看到这里的各位人才应该对相关知识有了更深刻的认识。理论有了接下来我会持续更新相关内容介绍下真实场景下如何对 JVM 进行调优以及故障排查。更多推荐阅读中台架构详解上 | 大咖说中台游戏行业应该如何建设数据中台30 年开源老兵10 年躬耕 OpenStack开源 1000 万行核心代码Python再夺冠上古语言COBOL大流行IEEE Spectrum 2020年度编程语言排行榜出炉美国禁止与字节跳动及微信交易腾讯股价暴跌字节跳动回应了
http://www.zqtcl.cn/news/926443/

相关文章:

  • 电商型网站建设价格ppt制作网站
  • 东莞做个网站查询工商营业执照
  • 从网址怎么看网站的域名租用云服务器多少钱
  • 网站开发技术有个人网页首页设计图片
  • 一站式网站建设平台做电商网站需要做什么准备
  • 网站开发小程序快站模板
  • 江苏集团网站建设智慧养老网站开发
  • 外网网址可以做英语阅读的网站怎么原创视频网站
  • 宁波网站建设流程图自己做网站可以揽业务吗
  • 赤峰市建设网站东胜做网站
  • 有口碑的坪山网站建设微信扫一扫登录网站如何做
  • 自己建网站要花多少钱蓟县网站建设
  • 兖州中材建设有限公司网站wordpress免签约接口
  • 湖北网站seo设计成都疾控最新通告
  • 商丘网站建设推广公司配资网站建设多少钱
  • 手机网站怎么做SEO优化gzip压缩 wordpress
  • 上下框架 网站app营销的核心是什么
  • 网站开发哪里有培训wordpress 主题 网址导航
  • 深圳市宝安区怎么样百度禁止seo推广
  • 手机电商网站 模板常熟做网站优化
  • 免费的logo设计网站网页设计与制作dw
  • 线上调研问卷在哪个网站上做网页设计学生作业
  • 云南高端网站建设网页设计工作室选址依据
  • 免费的编程自学网站互联网公司网站建设ppt
  • 免费发帖的网站网站空间服务器费用
  • 商城类的网站一般怎么做做ps从哪个网站上下载图片大小
  • 怎么做网站链接支付免费推广网站搭建
  • 威海 网站建设刚刚北京传来重大消息
  • 深圳返利网站开发做网站版权怎么写
  • 上传网站内容做社交电商第一步怎么做