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

旅游网站 建设平台分析国内自建站

旅游网站 建设平台分析,国内自建站,手表东莞网站建设技术支持,楼盘设计师工资一般多少1. JVM 内存结构 要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM#xff0c;调用类加载子系统加载 class#xff0c;将类的信息存入方法区 创建… 1. JVM 内存结构 要求 掌握 JVM 内存结构划分 尤其要知道方法区、永久代、元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java 命令 创建 JVM调用类加载子系统加载 class将类的信息存入方法区 创建 main 线程使用的内存区域是 JVM 虚拟机栈开始执行 main 方法代码 如果遇到了未见过的类会继续触发类加载过程同样会存入方法区 需要创建对象会使用堆内存来存储对象 不再使用的对象会由垃圾回收器在内存不足时回收其内存 调用方法时方法内的局部变量、方法参数所使用的是 JVM 虚拟机栈中的栈帧内存 调用方法时先要到方法区获得到该方法的字节码指令由解释器将字节码指令解释为机器码执行 调用方法时会将要执行的指令行号读到程序计数器这样当发生了线程切换恢复时就可以从中断的位置继续 对于非 java 实现的方法调用使用内存称为本地方法栈见说明 对于热点方法调用或者频繁的循环代码由 JIT 即时编译器将这些代码编译成机器码缓存提高执行性能 说明 加粗字体代表了 JVM 虚拟机组件 对于 Oracle 的 Hotspot 虚拟机实现不区分虚拟机栈和本地方法栈 会发生内存溢出的区域 不会出现内存溢出的区域 – 程序计数器 出现 OutOfMemoryError 的情况 堆内存耗尽 – 对象越来越多又一直在使用不能被垃圾回收 方法区内存耗尽 – 加载的类越来越多很多框架都会在运行期间动态产生新的类 虚拟机栈累积 – 每个线程最多会占用 1 M 内存线程个数越来越多而又长时间运行不销毁时 出现 StackOverflowError 的区域 JVM 虚拟机栈原因有方法递归调用未正确结束、反序列化 json 时循环引用 方法区、永久代、元空间 方法区是 JVM 规范中定义的一块内存区域用来存储类元数据、方法字节码、即时编译器需要的信息等 永久代是 Hotspot 虚拟机对 JVM 规范的实现1.8 之前 元空间是 Hotspot 虚拟机对 JVM 规范的另一种实现1.8 以后使用本地内存作为这些信息的存储空间 从这张图学到三点 当第一次用到某个类是由类加载器将 class 文件的类元信息读入并存储于元空间 XY 的类元信息是存储于元空间中无法直接访问 可以用 X.classY.class 间接访问类元信息它们俩属于 java 对象我们的代码中可以使用 从这张图可以学到 堆内存中当一个类加载器对象这个类加载器对象加载的所有类对象这些类对象对应的所有实例对象都没人引用时GC 时就会对它们占用的对内存进行释放 元空间中内存释放以类加载器为单位当堆中类加载器内存释放时对应的元空间中的类元信息也会释放 2. JVM 内存参数 要求 熟悉常见的 JVM 参数尤其和大小相关的 堆内存按大小设置 解释 -Xms 最小堆内存包括新生代和老年代 -Xmx 最大对内存包括新生代和老年代 通常建议将 -Xms 与 -Xmx 设置为大小相等即不需要保留内存不需要从小到大增长这样性能较好 -XX:NewSize 与 -XX:MaxNewSize 设置新生代的最小与最大值但一般不建议设置由 JVM 自己控制 -Xmn 设置新生代大小相当于同时设置了 -XX:NewSize 与 -XX:MaxNewSize 并且取值相等 保留是指一开始不会占用那么多内存随着使用内存越来越多会逐步使用这部分保留内存。下同 堆内存按比例设置 解释 -XX:NewRatio2:1 表示老年代占两份新生代占一份 -XX:SurvivorRatio4:1 表示新生代分成六份伊甸园占四份from 和 to 各占一份 元空间内存设置 解释 class space 存储类的基本信息最大值受 -XX:CompressedClassSpaceSize 控制 non-class space 存储除类的基本信息以外的其它信息如方法字节码、注解等 class space 和 non-class space 总大小受 -XX:MaxMetaspaceSize 控制 注意 这里 -XX:CompressedClassSpaceSize 这段空间还与是否开启了指针压缩有关这里暂不深入展开可以简单认为指针压缩默认开启 代码缓存内存设置 解释 如果 -XX:ReservedCodeCacheSize 240m所有优化机器代码不加区分存在一起 否则分成三个区域图中笔误 mthod 拼写错误少一个 e non-nmethods - JVM 自己用的代码 profiled nmethods - 部分优化的机器码 non-profiled nmethods - 完全优化的机器码 线程内存设置 官方参考文档 java 3. JVM 垃圾回收 要求 掌握垃圾回收算法 掌握分代回收思想 理解三色标记及漏标处理 了解常见垃圾回收器 三种垃圾回收算法 标记清除法 解释 找到 GC Root 对象即那些一定不会被回收的对象如正执行方法内局部变量引用的对象、静态变量引用的对象 标记阶段沿着 GC Root 对象的引用链找直接或间接引用到的对象加上标记 清除阶段释放未加标记的对象占用的内存 要点 标记速度与存活对象线性关系 清除速度与内存大小线性关系 缺点是会产生内存碎片 标记整理法 解释 前面的标记阶段、清理阶段与标记清除法类似 多了一步整理的动作将存活对象向一端移动可以避免内存碎片产生 特点 标记速度与存活对象线性关系 清除与整理速度与内存大小成线性关系 缺点是性能上较慢 标记复制法 解释 将整个内存分成两个大小相等的区域from 和 to其中 to 总是处于空闲from 存储新创建的对象 标记阶段与前面的算法类似 在找出存活对象后会将它们从 from 复制到 to 区域复制的过程中自然完成了碎片整理 复制完成后交换 from 和 to 的位置即可 特点 标记与复制速度与存活对象成线性关系 缺点是会占用成倍的空间 GC 与分代回收算法 GC 的目的在于实现无用对象内存自动释放减少内存碎片、加快分配速度 GC 要点 回收区域是堆内存不包括虚拟机栈 判断无用对象使用可达性分析算法三色标记法标记存活对象回收未标记对象 GC 具体的实现称为垃圾回收器 GC 大都采用了分代回收思想 理论依据是大部分对象朝生夕灭用完立刻就可以回收另有少部分对象会长时间存活每次很难回收 根据这两类对象的特性将回收区域分为新生代和老年代新生代采用标记复制法、老年代一般采用标记整理法 根据 GC 的规模可以分成 Minor GCMixed GCFull GC 分代回收 伊甸园 eden最初对象都分配到这里与幸存区 survivor分成 from 和 to合称新生代 当伊甸园内存不足标记伊甸园与 from现阶段没有的存活对象 将存活对象采用复制算法复制到 to 中复制完毕后伊甸园和 from 内存都得到释放 将 from 和 to 交换位置 经过一段时间后伊甸园的内存又出现不足 标记伊甸园与 from现阶段没有的存活对象 将存活对象采用复制算法复制到 to 中 复制完毕后伊甸园和 from 内存都得到释放 将 from 和 to 交换位置 老年代 old当幸存区对象熬过几次回收最多15次晋升到老年代幸存区内存不足或大对象会导致提前晋升 GC 规模 Minor GC 发生在新生代的垃圾回收暂停时间短 Mixed GC 新生代 老年代部分区域的垃圾回收G1 收集器特有 Full GC 新生代 老年代完整垃圾回收暂停时间长应尽力避免 三色标记 即用三种颜色记录对象的标记状态 黑色 – 已标记 灰色 – 标记中 白色 – 还未标记 起始的三个对象还未处理完成用灰色表示 该对象的引用已经处理完成用黑色表示黑色引用的对象变为灰色 依次类推 沿着引用链都标记了一遍 最后为标记的白色对象即为垃圾 并发漏标问题 比较先进的垃圾回收器都支持并发标记即在标记过程中用户线程仍然能工作。但这样带来一个新的问题如果用户线程修改了对象引用那么就存在漏标问题。例如 如图所示标记工作尚未完成 用户线程同时在工作断开了第一层 3、4 两个对象之间的引用这时对于正在处理 3 号对象的垃圾回收线程来讲它会将 4 号对象当做是白色垃圾 但如果其他用户线程又建立了 2、4 两个对象的引用这时因为 2 号对象是黑色已处理对象了因此垃圾回收线程不会察觉到这个引用关系的变化从而产生了漏标 如果用户线程让黑色对象引用了一个新增对象一样会存在漏标问题 因此对于并发标记而言必须解决漏标问题也就是要记录标记过程中的变化。有两种解决方法 Incremental Update 增量更新法CMS 垃圾回收器采用 思路是拦截每次赋值动作只要赋值发生被赋值的对象就会被记录下来在重新标记阶段再确认一遍 Snapshot At The BeginningSATB 原始快照法G1 垃圾回收器采用 思路也是拦截每次赋值动作不过记录的对象不同也需要在重新标记阶段对这些对象二次处理 新加对象会被记录 被删除引用关系的对象也被记录 垃圾回收器 - Parallel GC eden 内存不足发生 Minor GC采用标记复制算法需要暂停用户线程 old 内存不足发生 Full GC采用标记整理算法需要暂停用户线程 注重吞吐量 垃圾回收器 - ConcurrentMarkSweep GC 它是工作在 old 老年代支持并发标记的一款回收器采用并发清除算法 并发标记时不需暂停用户线程 重新标记时仍需暂停用户线程 如果并发失败即回收速度赶不上创建新对象速度会触发 Full GC 注重响应时间 垃圾回收器 - G1 GC 响应时间与吞吐量兼顾 划分成多个区域每个区域都可以充当 edensurvivorold humongous其中 humongous 专为大对象准备 分成三个阶段新生代回收、并发标记、混合收集 如果并发失败即回收速度赶不上创建新对象速度会触发 Full GC G1 回收阶段 - 新生代回收 初始时所有区域都处于空闲状态 创建了一些对象挑出一些空闲区域作为伊甸园区存储这些对象 当伊甸园需要垃圾回收时挑出一个空闲区域作为幸存区用复制算法复制存活对象需要暂停用户线程 复制完成将之前的伊甸园内存释放 随着时间流逝伊甸园的内存又有不足 将伊甸园以及之前幸存区中的存活对象采用复制算法复制到新的幸存区其中较老对象晋升至老年代 释放伊甸园以及之前幸存区的内存 G1 回收阶段 - 并发标记与混合收集 当老年代占用内存超过阈值后触发并发标记这时无需暂停用户线程 并发标记之后会有重新标记阶段解决漏标问题此时需要暂停用户线程。这些都完成后就知道了老年代有哪些存活对象随后进入混合收集阶段。此时不会对所有老年代区域进行回收而是根据暂停时间目标优先回收价值高存活对象少的区域这也是 Gabage First 名称的由来。 混合收集阶段中参与复制的有 eden、survivor、old下图显示了伊甸园和幸存区的存活对象复制 下图显示了老年代和幸存区晋升的存活对象的复制 复制完成内存得到释放。进入下一轮的新生代回收、并发标记、混合收集 4. 内存溢出 要求 能够说出几种典型的导致内存溢出的情况 典型情况 误用线程池导致的内存溢出 参考 day03.TestOomThreadPool 查询数据量太大导致的内存溢出 参考 day03.TestOomTooManyObject 动态生成类导致的内存溢出 参考 day03.TestOomTooManyClass 5. 类加载 要求 掌握类加载阶段 掌握类加载器 理解双亲委派机制 类加载过程的三个阶段 加载 将类的字节码载入方法区并创建类.class 对象 如果此类的父类没有加载先加载父类 加载是懒惰执行 链接 验证 – 验证类是否符合 Class 规范合法性、安全性检查 准备 – 为 static 变量分配空间设置默认值 解析 – 将常量池的符号引用解析为直接引用 初始化 静态代码块、static 修饰的变量赋值、static final 修饰的引用类型变量赋值会被合并成一个 cinit 方法在初始化时被调用 static final 修饰的基本类型变量赋值在链接阶段就已完成 初始化是懒惰执行 验证手段 使用 jps 查看进程号 使用 jhsdb 调试执行命令 jhsdb.exe hsdb 打开它的图形界面 Class Browser 可以查看当前 jvm 中加载了哪些类 控制台的 universe 命令查看堆内存范围 控制台的 g1regiondetails 命令查看 region 详情 scanoops 起始地址 结束地址 对象类型 可以根据类型查找某个区间内的对象地址 控制台的 inspect 地址 指令能够查看这个地址对应的对象详情 使用 javap 命令可以查看 class 字节码 代码说明 day03.loader.TestLazy - 验证类的加载是懒惰的用到时才触发类加载 day03.loader.TestFinal - 验证使用 final 修饰的变量不会触发类加载 jdk 8 的类加载器 名称加载哪的类说明Bootstrap ClassLoaderJAVA_HOME/jre/lib无法直接访问Extension ClassLoaderJAVA_HOME/jre/lib/ext上级为 Bootstrap显示为 nullApplication ClassLoaderclasspath上级为 Extension自定义类加载器自定义上级为 Application 双亲委派机制 所谓的双亲委派就是指优先委派上级类加载器进行加载如果上级类加载器 能找到这个类由上级加载加载后该类也对下级加载器可见 找不到这个类则下级类加载器才有资格执行加载 双亲委派的目的有两点 让上级类加载器中的类对下级共享反之不行即能让你的类能依赖到 jdk 提供的核心类 让类的加载有优先次序保证核心类优先加载 对双亲委派的误解 下面面试题的回答是错误的 错在哪了 自己编写类加载器就能加载一个假冒的 java.lang.System 吗? 答案是不行。 假设你自己的类加载器用双亲委派那么优先由启动类加载器加载真正的 java.lang.System自然不会加载假冒的 假设你自己的类加载器不用双亲委派那么你的类加载器加载假冒的 java.lang.System 时它需要先加载父类 java.lang.Object而你没有用委派找不到 java.lang.Object 所以加载会失败 以上也仅仅是假设。事实上操作你就会发现自定义类加载器加载以 java. 打头的类时会抛安全异常在 jdk9 以上版本这些特殊包名都与模块进行了绑定更连编译都过不了 代码说明 day03.loader.TestJdk9ClassLoader - 演示类加载器与模块的绑定关系 6. 四种引用 要求 掌握四种引用 强引用 普通变量赋值即为强引用如 A a new A(); 通过 GC Root 的引用链如果强引用不到该对象该对象才能被回收 软引用SoftReference 例如SoftReference a new SoftReference(new A()); 如果仅有软引用该对象时首次垃圾回收不会回收该对象如果内存仍不足再次回收时才会释放对象 软引用自身需要配合引用队列来释放 典型例子是反射数据 弱引用WeakReference 例如WeakReference a new WeakReference(new A()); 如果仅有弱引用引用该对象时只要发生垃圾回收就会释放该对象 弱引用自身需要配合引用队列来释放 典型例子是 ThreadLocalMap 中的 Entry 对象 虚引用PhantomReference 例如 PhantomReference a new PhantomReference(new A(), referenceQueue); 必须配合引用队列一起使用当虚引用所引用的对象被回收时由 Reference Handler 线程将虚引用对象入队这样就可以知道哪些对象被回收从而对它们关联的资源做进一步处理 典型例子是 Cleaner 释放 DirectByteBuffer 关联的直接内存 代码说明 day03.reference.TestPhantomReference - 演示虚引用的基本用法 day03.reference.TestWeakReference - 模拟 ThreadLocalMap, 采用引用队列释放 entry 内存 7. finalize 要求 掌握 finalize 的工作原理与缺点 finalize 它是 Object 中的一个方法如果子类重写它垃圾回收时此方法会被调用可以在其中进行资源释放和清理工作 将资源释放和清理放在 finalize 方法中非常不好非常影响性能严重时甚至会引起 OOM从 Java9 开始就被标注为 Deprecated不建议被使用了 finalize 原理 对 finalize 方法进行处理的核心逻辑位于 java.lang.ref.Finalizer 类中它包含了名为 unfinalized 的静态变量双向链表结构Finalizer 也可被视为另一种引用对象地位与软、弱、虚相当只是不对外无法直接使用 当重写了 finalize 方法的对象在构造方法调用之时JVM 都会将其包装成一个 Finalizer 对象并加入 unfinalized 链表中 Finalizer 类中还有另一个重要的静态变量即 ReferenceQueue 引用队列刚开始它是空的。当狗对象可以被当作垃圾回收时就会把这些狗对象对应的 Finalizer 对象加入此引用队列 但此时 Dog 对象还没法被立刻回收因为 unfinalized - Finalizer 这一引用链还在引用它嘛为的是【先别着急回收啊等我调完 finalize 方法再回收】 FinalizerThread 线程会从 ReferenceQueue 中逐一取出每个 Finalizer 对象把它们从链表断开并真正调用 finallize 方法 由于整个 Finalizer 对象已经从 unfinalized 链表中断开这样没谁能引用到它和狗对象所以下次 gc 时就被回收了 finalize 缺点 无法保证资源释放FinalizerThread 是守护线程代码很有可能没来得及执行完线程就结束了 无法判断是否发生错误执行 finalize 方法时会吞掉任意异常Throwable 内存释放不及时重写了 finalize 方法的对象在第一次被 gc 时并不能及时释放它占用的内存因为要等着 FinalizerThread 调用完 finalize把它从 unfinalized 队列移除后第二次 gc 时才能真正释放内存 有的文章提到【Finalizer 线程会和我们的主线程进行竞争不过由于它的优先级较低获取到的CPU时间较少因此它永远也赶不上主线程的步伐】这个显然是错误的FinalizerThread 的优先级较普通线程更高原因应该是 finalize 串行执行慢等原因综合导致 代码说明 day03.reference.TestFinalize - finalize 的测试代码
http://www.zqtcl.cn/news/141369/

相关文章:

  • 网站模板安装出入成都通知今天
  • wordpress网站 添加微信网站设计O2O平台佛山总代理
  • 广州网站开发定制方案网站建设应该考虑哪些方面
  • 在线网站建设培训门户类网站图片
  • 佛山乐从网站建设自媒体平台收益排行榜
  • 网站建设项目需求陕西陕煤建设集团有限公司网站
  • 鼓楼网站开发永州做网站tuantaogou
  • ui网站建设站评价文山建设5G网站
  • 深圳 网站设计公司企业网络搭建教程
  • 做网站策划遇到的问题全网营销型网站模版
  • 网站建设费属于无形资产吗广州高铁新建站在哪里
  • 网站建设平台报价深圳市房产交易中心官网
  • 注册网站网前端素材网
  • 快3网站制作 优帮云贾汪区建设局网站
  • 南昌市有帮做网站的吗网站联动
  • 英文网站建设服务合同模板网站详情页艺术字怎么做的
  • discuz仿搜索网站做网站开发用哪种语言好
  • 企业网站服务网络设备维护是做什么的
  • 罗湖网站公司网站服务器建设合同
  • 公司网站设计注意什么免费名字设计成图案
  • python3 网站建设济南网站建设(选 聚搜网络)
  • 建网站在哪里做广告上海 网站撤销备案
  • 个人可以备案几个网站做网站和网站页面设计
  • 拉丝机东莞网站建设下载安装百度一下
  • 河北建设厅官方网站山西手动网站建设推广
  • 连云港网站建设开发网络营销顾问服务
  • 怎么做网站免有什么网站可以免费建站
  • 安全的营销型网站建设深圳网站建设哪家
  • wordpress能开发商城网站吗seo软件
  • 广东网站建设制作价格低网页升级访问中每天正常更新中