干货内容:SEO优化中文章内容伪原创注意事项

优采云 发布时间: 2022-11-16 04:24

  干货内容:SEO优化中文章内容伪原创注意事项

  1、采集内容混乱,句子不清晰,读者无法获取所需信息。

  2.虽然内容可读,但是大部分文章都是采集,复制自其他网站,本身没有原创内容。

  3、网页中穿插关键词或文章与主题无关,试图欺骗搜索引擎,对搜索相关关键词的用户没有真正的帮助。

  4、冒充官网欺骗用户,在title和meta标签中声明不实。

  

  5、网站含有大量违法或欺诈内容,可能造成用户财产安全损失。

  无论是百度还是谷歌,任何搜索引擎的最终目的都是为了实现其真正的目的,即为用户的搜索提供准确的结果。如果我们想让我们的页面显示在搜索引擎结果的前面,我们就应该真正为用户提供对搜索引擎有价值的内容。如何获取真实有价值的内容?

  ①原创文章:搜索引擎喜欢新鲜事物,自己的原创 文章,长期稳定更新原创 文章,会吸引用户和搜索引擎,自然搜索引擎蜘蛛给网站稳定的爬行和收录。即使是采集其他网站的文章,也不能直接复制粘贴,必须做伪原创处理,比如修改文章的内容> 头条,在文章内容中加入一些自己的观点和观点等。

  ②内容清晰:原创的内容未必总能赢得搜索引擎的青睐,就像一个好的文章一样,这样潦草的笔迹、错别字、不清楚的段落,没有人会受不了。所以我们在整理网站的内容时,要在心里问问自己。当你看到自己整理好的内容页时,你忍心看下去吗?会去文章,我想用户肯定不会浏览,搜索引擎也肯定不会青睐。

  ③醒目的文章标题:门户网站不同于纸质媒体,不需要太严谨。在互联网上,人们更愿意追求个性,越是死板的东西,用户关注度就越低,搜索引擎自然不会坐以待毙。因此,要想获得搜索引擎蜘蛛的青睐,给予更多的爬行时间和爬行量,就需要标新立异。使用醒目的标题不仅可以吸引用户的注意力,还可以吸引搜索引擎的青睐。标题相当于文章内容的核心,必须突出内容的核心词,以便用户在搜索相关词时可以检索到您的网站页面。模棱两可的标题将失去其内容的价值。即使内容写得很好,

  

  ④ 精确的锚文本连接:互联网就像一张大蜘蛛网,网站页面是每个节点,链接是它们之间的线。对于文章内容,锚文本链接意义重大。它不仅为用户提供了一个扩大阅读相关内容的渠道,而且从搜索引擎的角度来看,它也是一个页面为另一个页面投票。因此,准确的锚文本可以帮助搜索引擎有效提高相关页面的关键词排名。所以在更新文章的时候,不要随便给某个词不相关的链接,也不要在页面上随意给不相关的页面链接。

  ⑤ 集中的文章概览:为文章写一个简短的概览,帮助用户快速了解文章的内容,也有助于在搜索中完善文章的内容引擎排名。如果直接用文章的第一段作为概览,在搜索结果中,用户无法从描述中知道结果是否是用户想要的,搜索引擎也无法知道很好地判断内容。

  ⑥干净的页面:网站页面上挂了很多广告,铺天盖地,内容页放在夹缝里。当用户进入页面时,他们必须搜索很长时间才能阅读内容。搜索引擎肯定不会喜欢这样的网站。尤其是弹窗广告、欺骗性广告、违反相关法律法规的广告等。尽量为用户提供干净的页面,让用户轻松浏览页面,这是网站必须提供的用户体验。所以这就需要我们在收入和用户之间找到一个平衡点。

  ⑦不堆砌不相关的页面和内容:在网站页面设置与本文章主题相同的相关阅读、精彩推荐、热门头条等内容,方便用户扩展阅读。这种高质量的内容页面创建非常有利于用户体验。但往往为了提高相关关键词的排名,很多站长异想天开地在页面上堆放了很多关键词,以期获得相关词的排名。显然,这种行为不能提高用户体验,而且欺骗了搜索引擎,自然不会被搜索引擎看好。

  只有站在用户的角度去创造网站内容,提供用户真正想要的内容,给用户一个良好的阅读环境,用户自然会喜欢你的网站,搜索引擎自然而然会中招喜欢你的网站,所以这次解决百度作弊算法更新带来的影响,就是改变自己的网站内容质量,给用户一个真实安静的阅读世界.

  解决方案:一文详解JVM垃圾收集机制,动图帮你轻松理解大厂面试难点

  前言

  上一篇文章已经介绍了JVM架构和运行时数据区(内存区),本篇文章将介绍JVM的重点内容——垃圾回收。众所周知,与C/C++等语言相比,Java可以省去手动内存管理的繁琐操作,极大地解放了Java程序员的生产力,而这要归功于JVM的垃圾回收机制和内存分配策略。我们在写程序的时候通常不会察觉到这一点,但是如果是在生产环境中,JVM的不同配置对服务器的性能影响很大,所以掌握JVM调优是高级Java工程师的必备技能。俗话说,“基础不牢,地动山摇”。在那之前,让'

  既然要介绍垃圾回收机制,我们需要明确以下几个问题:

  哪些内存区域需要进行垃圾回收?

  如何判断一个物品是否可回收?

  新对象是如何分配的?

  垃圾采集是如何完成的?

  本文将按照以下文本结构展开,对以上问题一一解答。

  需要垃圾回收的内存区域;

  判断一个物体是否可回收的方法;

  主流垃圾回收算法介绍;

  JVM的内存分配和垃圾回收机制。

  下面开始正文,还是图文并茂的老套路,走起。

  1.需要垃圾回收的内存区域

  我们先回顾一下JVM的运行时数据区:

  JVM 运行时数据区

  其中,程序计数器、Java虚拟机栈和本地方法栈都是线程私有的,对应的线程是共生关系,随线程而生,随线程而灭,栈帧在stack也跟着方法的进入和退出。push 和 pop 操作是有序进行的。因此,这些区域的内存分配和回收是非常确定的。当方法结束或者线程结束时,内存会相应释放,所以不需要考虑这些区域的内存回收。

  堆和方法区是不同的。Java对象几乎都是在堆上创建的,方法区存放的是虚拟机加载的类型信息、常量、静态变量、实时编译器编译的代码缓存等。对于数据,方法中的运行时常量池区域存储各种文字和符号引用。上述大部分数据只能在运行时确定,因此需要进行动态内存管理。

  还需要注意的是,JVM中垃圾回收器主要关注的是Java堆,因为这里垃圾回收的“性价比”最高,尤其是新生代(分代算法后面会介绍)垃圾采集 可以一次性回收 70% - 99% 的内存。在方法区,由于垃圾回收的判断条件严格,尤其是类型卸载的判断条件,其回收性价比很低,所以有些垃圾回收器根本不支持或者不完全支持方法区的垃圾回收,比如 JDK 11 中的 ZGC 采集器不支持类型卸载。

  2. 判断一个对象是否可回收的方法 2.1 引用计数法

  引用计数方法的实现非常简单。向对象添加一个引用计数器。每当有对它的引用时,计数器值就会加一;不可能再次使用。在大多数情况下,这种方法可以奏效,但是在循环引用的情况下,引用计数的方法就无能为力了。例如下面的情况:

  public class Student {<br /> // friend 字段<br /> public Student friend = null;<br /> <br /> public static void test() {<br /> Student a = new Student();<br /> Student b = new Student();<br /> a.friend = b;<br /> b.friend = a;<br /> a = null;<br /> b = null;<br /> System.gc();<br /> }<br />}

  上面的代码创建了两个 Student 实例 a 和 b,并将它们各自的 friend 字段分配给彼此。另外,这两个对象没有引用,再赋值给null。在这种情况下,这两个对象不能再被访问,但是因为它们相互引用,所以它们的引用计数不为零,引用计数算法无法回收它们。如下所示:

  循环引用

  但是在Java程序中,a和b是可以回收的,因为JVM并没有使用引用计数的方法来判断对象是否可回收,而是使用了可达性分析的方法。

  2.2 可达性分析方法

  该算法的基本思想是使用一系列称为“GC Roots”的根对象作为起始节点集(GC Root Set)。从这些节点开始,按照引用关系向下查找。搜索过程所经过的路径称为“引用链”,如果一个对象与GC Roots之间没有引用链,则意味着该对象不再被使用,可以被回收。要进行可达性分析,首先需要枚举根节点(GC Roots)。在枚举根节点的过程中,为了防止对象的引用关系发生变化,需要暂停所有的用户线程(垃圾回收以外的线程)。这种暂停所有用户线程的行为称为(Stop The World)。可达性分析方法如下图所示:

  可达性分析

  图中绿色的是位于GC Root Set中的GC Roots。与它们关联的所有对象都是可访问的并标记为蓝色,而所有不与它们关联的对象都是不可访问的并标记为灰色。即使是不可达对象,也不保证能被回收。如果对象同时满足以下条件,它仍然有“逃脱”的可能:

  

  该对象具有重写的 finalize() 方法(Object 类中的方法);

  finalize() 方法将自身链接到引用链;

  JVM之前没有调用过对象的finalize()方法(因为JVM在回收可回收对象时会调用并且只会调用对象的finalize()方法)。

  但由于finalize()方法运行成本高,不确定性大,不能保证每个对象的调用顺序,不推荐使用。那么GC Roots到底有何神圣之处呢?在Java语言中,可以固定为GC Roots的对象包括以下几种:

  虚拟机栈中引用的对象(栈帧中的局部变量表),如各线程调用的方法栈中使用的参数、局部变量、临时变量等。

  方法区中类静态属性引用的对象,如Java类的引用类型静态变量。

  方法区常量引用的对象,如字符串常量池(String Table)中的引用。

  本地方法栈中JNI引用的对象(也就是所谓的Native方法)。

  Java虚拟机内部的引用,比如基本数据类型对应的Class对象,以及一些常见的异常对象(比如

  NullPointExcepiton, OutOfMemoryError) 等,以及系统类加载器。

  同步锁(synchronized 关键字)持有的所有对象。

  反映Java虚拟机内部情况的JM XBean,在JVM TI中注册的回调,本地代码缓存等。

  3. 垃圾采集算法介绍 3.1 Mark-Clear 算法

  mark-clear算法的思路很简单。顾名思义,该算法的过程分为标记和清除两个阶段:首先标记所有需要回收的对象,标记过程就是利用可达性分析判断对象是否属于垃圾的过程。标记完成后统一回收所有标记的对象,或者依次标记存活的对象,统一回收所有未标记的对象。*敏*感*词*如下:

  标记扫除算法

  这个算法虽然很简单,但是有两个明显的缺点:

  执行效率不稳定。如果Java堆中收录大量的对象,而且大部分都需要回收,此时必须进行大量的标记和清除动作,导致标记和清除这两个过程的执行效率降低随着对象数量的增加而清除;

  导致内存空间碎片化。标记和清除后,会产生大量不连续的内存碎片。太多的空间碎片可能导致程序以后需要分配大对象时,找不到足够的连续内存,不得不提前触发另一次垃圾回收动作。极大地影响了程序运行的效率。

  3.2 标记复制算法

  mark-copy算法也就是常说的copy算法,该算法正好解决了mark-clear算法在面对大量可回收对象时执行效率低的问题。实现方法也很容易理解:在可用内存中划分两个大小相同的区域,每次只使用其中一个,另一个闲置。当第一个区域用完后,将所有存活的对象复制到第二个区域,然后清除所有第一个区域。如下所示:

  标记复制算法

  这个算法很适合对象存活率低的情况,因为它只关注存活的对象,不需要关心可回收的对象,所以JVM中新生代的垃圾回收就是这个算法。但其缺点也很明显。每次都要浪费一半的内存,太奢侈了。但是JVM中的new generation有更精细的内存划分,更好的解决了这个问题,见下文。

  3.3 标记整理算法

  该算法完美解决了mark-clear算法的空间碎片问题。mark过程与“mark-clear”算法相同,只是后面的步骤并不直接清理可回收对象,而是让所有存活的对象都送入内存空间。移动一端,然后直接清理边界外的内存。

  标记算法

  虽然这个算法可以很好的解决空间碎片的问题,但是每次垃圾回收的时候都需要移动幸存的对象,更新引用这些对象的地方。对象移动的操作也需要暂停用户线程(Stop The World)。

  3.4 分代采集算法

  它与其说是一种算法,不如说是一种理论。现在的大多数虚拟机实现都是按照“分代采集”的理论设计的,这可以看作是一种经验法则,因为开发人员在开发过程中发现JVM中存活对象的数量和它们的年龄之间存在一定的规律他们,如下图所示:

  

  JVM中存活对象的数量与年龄的关系

  在此基础上,提出以下假设:

  大多数对象都是短暂的。

  在垃圾采集过程中存活的对象越多,它就越难消亡。

  根据这两个假设,JVM的堆内存大致可以分为新生代和老年代。大多数新生代对象的存活时间都很短,每次回收只关注如何保持少量的存活,而不是标记大量将要回收的对象,大量的空间可以以相对较快的速度回收成本低,所以这方面的垃圾回收一般采用mark-copy算法,频率比较高。老年代是一些难以消亡的对象,可以采用mark-sweep和mark-sweeping算法进行垃圾回收,频率可以低一些。

  根据Hotspot虚拟机的实现,新生代和老年代的垃圾回收分为不同的类型,有不同的名词,如下:

  部分回收(Partial GC):是指以不完全回收整个Java堆为目标的垃圾回收,又分为: Minor GC/Young GC:是指以新生代为目标的垃圾回收。老年代采集(Major GC/Old GC):指只针对老年代的垃圾采集。目前只有cms采集器的并发采集阶段单独采集老年代。混合采集(Mixed GC):指的是垃圾采集,其目标是采集整个新生代和部分老年代。目前,只有 G1 采集器具有此行为。

  全堆采集(Full GC):采集整个J​​ava堆和方法区的垃圾采集。

  人们经常混淆 Major GC 和 Full GC,但这是有道理的,因为这两种 GC 行为都收录了老年代的垃圾回收,而单独的老年代回收(Major GC)是比较少见的。大多数情况下只要包括老年代的采集,就会是全堆采集(Full GC),不过最好区分清楚。

  4. JVM的内存分配和垃圾回收机制

  经过前面的铺垫,现在我们终于可以一窥JVM的内存分配和垃圾回收机制的本来面目了。

  4.1 JVM堆内存的划分

  JVM堆内存划分,从Java 8开始,没有永久代

  Java堆是JVM管理的最大的一块内存,也是垃圾采集器管理的区域。大多数垃圾采集器会将堆内存划分为几个区域,如上图所示。整体分为新生代和老年代,比例为1:2。新一代又分为Eden、From Survivor和To Survivor。默认比例为 8 : 1 : 1,请注意,这可以通过 SurvivorRatio 参数进行设置。请注意,从 JDK 8 开始,JVM 中不再有永久代的概念。不管Java堆上哪个区域只能存放对象实例,对Java堆进行细分的目的是为了更好的回收内存或者更快的分配内存。

  4.2 分代采集原理 4.2.1 新生代中对象的分配与回收

  大多数情况下,对象首先分配在新生代的伊甸园区。当Eden区没有足够的空间可供分配时,虚拟机就会发起一次Minor GC。Eden、From Survivor 和 To Survivor 的比例是 8 : 1 : 1。这个比例的原因是大部分对象都在死亡,垃圾回收时 Eden 中存活的对象数量不会太多,而幸存者空间很小 容纳一点点就够了。每个新生代中的可用内存空间是整个新生代容量的90%(Eden的80%加上To Survivor的10%),只有From Survivor空间,也就是新生代的10%会被“浪费” .不会像原来的mark-copy算法那样浪费一半的内存空间,From Survivor和To Survivor的空间是不固定的,但在 S0 和 S1 之间动态转换。在第一次Minor GC中,S1会被选为To Survivor,将Eden中幸存的对象复制给它,并将该对象的年龄增加1。注意新生代使用的垃圾回收算法为标记复制算法的改进版本。下面是*敏*感*词*。请注意,第一步的颜色变化是为了醒目,虚拟机只是进行标记幸存对象的操作。下面是*敏*感*词*。请注意,第一步的颜色变化是为了醒目,虚拟机只是进行标记幸存对象的操作。下面是*敏*感*词*。请注意,第一步的颜色变化是为了醒目,虚拟机只是进行标记幸存对象的操作。

  第一次Minor GC*敏*感*词*

  在后续的Minor GC中,S0和S1会交替转化为From Survivor和To Survivor,将Eden和From Survivor中存活的对象复制到To Survivor中,age会增加1。如下图:

  后续Minor GC*敏*感*词*

  4.2.2 对象提升到老年代

  在以下情况下,对象会被提升到老年代。

  长寿对象会进入老年代

  对象在 Survivor 区每经历一次 Minor GC,其年龄就会增加 1 年。当它的年龄增长到一定程度(默认为15),就会被提升到老年代。对象晋升到老年代的年龄阈值可以通过参数-XX:MaxTenuringThreshold设置。这个参数的最大值是15,因为对象的年龄信息保存在对象头中,占用4位内存,可以表示的最大数是15。

  长期存活对象晋升到老年代*敏*感*词*

  2.大对象可以直接进入老年代

  对于大对象,尤其是很长的字符串,或者元素数量多的数组,如果在Eden中分配,很容易过早占用Eden空间而引起Minor GC,而大对象在Eden和两个Survivor之间来回复制也有显着的内存复制开销。所以我们可以通过设置-XX:PretenureSizeThreshold这个虚拟机参数让大对象直接进入老年代。

  3.动态对象年龄判断

  为了更好的适应不同程序的内存状态,HotSpot虚拟机并不总是要求对象的年龄必须达到-XX:MaxTenuringThreshold才能提升到老年代。如果Survivor空间中所有同龄对象的大小之和大于Survivor空间的一半,则年龄大于或等于这个年龄的对象可以直接进入老年代,无需等待in中要求的年龄-XX:MaxTenuringThreshold。

  4.空间分配保障(Handle Promotion)

  当Minor GC后Survivor空间不足以容纳存活的对象时,就需要依赖其他内存区域(其实大部分情况下是老年代)进行分配保证。在Minor GC发生之前,虚拟机首先要检查老年代中的最大可用连续空间是否大于新生代中所有对象的总空间。如果这个条件成立,那么这次Minor GC可以保证是安全的。如果不成立,虚拟机会先检查-XX:HandlePromotionFailure参数的设置值是否允许保证失败(Handle Promotion Failure);如果允许,会继续检查老年代最大可用连续空间是否大于晋升到老年代的对象的平均值,如果大于则尝试Minor GC,虽然这种Minor GC有风险;如果小于,或者 -XX: HandlePromotionFailure 设置不允许风险,那么将执行 Full GC。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线