你家的路由器应该升级Wi-Fi 6了!
在内核虚拟内存中,包含了内核中的代码和数据结构。 内核虚拟内存中的某些区域会被映射到所有进程共享的物理页面中去,因此你会看到 ”内核虚拟内存“ 中实际上是包含了 ”物理内存“ 的,它们两者存在映射关系。
而从应用场景上来讲,每个进程也会去共享内核的代码和全局数据结构,因此就会被映射到所有进程的物理页面中去。 看上去也没什么大开销的东西,就一个 Go 进程?就这? 再定眼一看,某同学就说 VSZ 那么高,而某云上的容器内存指标居然恰好和 VSZ 的值相接近,因此就怀疑是不是 VSZ 所导致的,觉得存在一定的关联关系。 这个猜测的结果到底是否正确呢? 基础知识 本篇文章将主要围绕 Go 进程的 VSZ 来进行剖析,看看到底它为什么那么 "高"。 第一节为前置的补充知识,大家可按顺序阅读。 什么是 VSZ VSZ 是该进程所能使用的虚拟内存总大小,它包括进程可以访问的所有内存,其中包括了被换出的内存(Swap)、已分配但未使用的内存以及来自共享库的内存。 为什么要虚拟内存 在前面我们有了解到 VSZ 其实就是该进程的虚拟内存总大小,那如果我们想了解 VSZ 的话,那我们得先了解 “为什么要虚拟内存?”。 本质上来讲,在一个系统中的进程是与其他进程共享 CPU 和主存资源的。 因此在现代的操作系统中,多进程的使用非常的常见,如果太多的进程需要太多的内存,在没有虚拟内存的情况下,物理内存很可能会不够用,就会导致其中有些任务无法运行,更甚至会出现一些很奇怪的现象。 例如 “某一个进程不小心写了另一个进程使用的内存”,就会造成内存破坏,因此虚拟内存是非常重要的一个媒介。 虚拟内存包含了什么 虚拟内存,又分为:
每一个进程的虚拟内存都是独立的, 内部结构如下图所示。 在上述代码中,类 InitTest 通过 A.value 引用了类 B 中声明的静态域 value。由于 value是在类 B 中声明的,只有类 B 会被初始化,而类 A 则不会被初始化。 创建自己的类加载器 在 Java 应用开发过程中,可能会需要创建应用自己的类加载器。典型的场景包括实现特定的 Java 字节代码查找方式、对字节代码进行加密/解密以及实现同名 Java 类的隔离等 。创建 自己的 类加载 器并不 是 一件复杂 的事情 ,只需要继承自java.lang.ClassLoader 类并覆写对应的方法即可。java.lang.ClassLoader 中提供的方法有不少,下面介绍几个创建类加载器时需要考虑的:
这里比较 容易混淆的是 findClass()方法和 loadClass()方法的作用。前面提到过,在Java 类的链接过程中,会需要对 Java 类进行解析,而解析可能会导致当前 Java 类所引用的其它 Java 类被加载。在这个时候,JVM 就是通过调用当前类的定义类加载器的 loadClass()方法来加载其它类的。findClass()方法则是应用创建的类加载器的扩展点。应用自己的类加载器应该覆写 findClass()方法来添加自定义的类加载逻辑。loadClass()方法的默认实现会负责调用 findClass()方法。前面提到,类加载器的代理模式默认使用的是父类优先的策略。这个策略的实现是封装在 loadClass()方法中的。如果希望修改此策略,就需要覆写 loadClass()方法。
下面的代码给出了自定义的类加载的常见实现模式 (编辑:唐山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |