加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

隐匿在 Linux 背后的机制

发布时间:2021-02-13 14:49:42 所属栏目:外闻 来源:互联网
导读:学习 Rust 已经有一段时间了,断断续续地在业余时间造了一些轮子。通过这一系列的练习和仿造,对于如何学习新的编程语言有一些新的感悟。这篇文章讲的方式并非是捷径,也不是什么 7 天精通,而是继续使用笨办法地方式来进行学习。 从我的角度来看,前者的介

学习 Rust 已经有一段时间了,断断续续地在业余时间造了一些轮子。通过这一系列的练习和仿造,对于如何学习新的编程语言有一些新的感悟。这篇文章讲的方式并非是捷径,也不是什么 7 天精通,而是继续使用笨办法地方式来进行学习。

从我的角度来看,前者的介绍过于简单,只是告诉了你应该这么做,但是没有说要怎么做。而后者则难度太大,对于大部分的人来说,几乎是不会想着去做这样的事情。而本文的难度呢,刚好介于两者之间,至于是不是中间嘛,也不好说。难度,因人而异,因时间也有区别。

对于编程和计算机理解越来越深刻,那么原先难度适中的事情,因为做过会变得更加简单;而原先复杂的事情,如果我们还没做过,那么我们可能还觉得它依然相当的复杂。

为什么学习新的编程语言?

工作多年,我们依然会和同事、朋友讨论到:业务是永恒的,技术是永远在变的。所以,成为一个业务专家更容易、更持续,成为一个技术专家更难、更需要持续提升。选择很难,因为我们不是火星人,也没有上帝视角。所以,成为一个技术上的专家,我们需要不断地接触一些新的东西,接受一些新的概念。其中的一种模式便是,人们口中经常说的:每年学习一门新的语言。

从个人的角度来看,这是一个非常 SMART (具体、可度量、可实现、相关性、有时限)的目标。所以,它还会存在这么一些优点:

  1. 保持学习的习惯。
  2. 为技术热情添到香油。
  3. 学习不同的编程模式。
  4. 拓展职业机会和前景。

稍微大的点系统都会有很多依赖的组件,这些组件底层都有可能会用到一些反射 或者 字节码框架 , 会生成一些你看不懂类名的类

一旦第三方框架出现问题 , 你的系统很有可能也会受影响

调大元空间 , 有监控系统的设置报警机制 , 给自己系统争取一些缓冲时间也是有必要的

5.-XX:TraceClassLoading -XX:TraceClassUnloading

追踪类加载和类卸载的情况 , 可以在 Tomcat 的 catalina.out 日志文件中

打印出来JVM中加载了哪些类,卸载了哪些类

6.-XX:SoftRefLRUPolicyMSPerMB: JVM 可以忍受多久 软引用不被回收

如果是 0 则每次都会把软引用回收掉释放内存

有一个情况是反射在 15 次后会动态生成一些软引用类来提高反射的效率 , 当 ygc 的时候把这些软应用给回收了

但是它们的类加载器或者一些奇怪名字的类还在元空间 , 那下次要用这个反射对象的时候又得重新创建

就造成了元空间慢慢无限增大从而触发 OOM , 建议这个参数设置 2000 - 5000 单位是: ms

7.-XX:+DisableExplicitGC: 关闭显示的调用 System.gc() , System.gc() 是触发类似 full gc 的操作

开启 or 关闭 有两个情况

关闭: 防止 team 里有刚入职的小天才写完一个业务逻辑就给你来一个 System.gc() 来优化内存 (别问 问那个小天才就是我)

开启: 项目里面有 Nio 相关的操作会用到直接内存 , 在 Java 中是 DirecByteBuffer 对象来申请的

在某些不合理的情况下导致控制这块区域的 DirecByteBuffer 会晋升到老年代

Nio 在申请堆外内存空间不足的时候会手动调用 System.gc() 去回收 DirecByteBuffer 堆外内存

有用到 Nio 的系统把这个参数关掉是有一定概率发生 Direct buffer memory 的

关闭还是打开取决于你自己的系统 , 以及能不能做到 code review 不让程序员自己去显示的调用 System.gc()

8.-XX:G1MixedGCCountTarget: 设置垃圾回收混合回收阶段,最多可以拆成几次回收

G1 的垃圾回收是分为 初始标记、并发标记、最终标记、混合回收 这几个阶段的

其中混合回收是可以并发的反复回收多次 , 这样的好处是避免单次停顿回收 stw 时间太长

停止系统一会儿 , 回收掉一些 Region , 再让系统运行一会儿 , 然后再次停止系统一会儿 , 再次回收掉一些 Region

这样可以尽可能让系统不要停顿时间过长 , 可以在多次回收的间隙 , 也运行一下

在一定程度上可以防止部分接口相应超时

六、小结

相信你看到这里 , 应该对高并发系统中 对象如何吃 JVM 内存 频繁 遇到 gc 如何解决 已经有所了解了 。

尽管有效的解决办法仍然是加机器 , 但是加多少台机器 , 怎么加机器 , JVM 参数要如何设置都有所了解了。


 

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读