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

网站开发 就业简历模板诸城网站建设诸城

网站开发 就业简历模板,诸城网站建设诸城,建设银行网站查询密码,微信网站开发教程面试宝典之深谈JVM 1.为什么需要JVM#xff0c;不要JVM可以吗#xff1f; 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译#xff0c;到处运行 2.JVM可以运行Class文件 2.JDK#xff0c;JRE以及JVM的关系 3.我们的编译器到底干了什么事#xff1f; 仅仅是将我们的 .ja…面试宝典之深谈JVM 1.为什么需要JVM不要JVM可以吗 1.JVM可以帮助我们屏蔽底层的操作系统 一次编译到处运行 2.JVM可以运行Class文件 2.JDKJRE以及JVM的关系 3.我们的编译器到底干了什么事 仅仅是将我们的 .java 文件转换成了 .class 文件实际上就是文件格式的转换对等信息转换。 4.类加载机制 类加载机制其实就是虚拟机把Class文件加载到内存并对数据进行校验转换解析和初始化形成可以虚拟机直接使用的Java类型即java.lang.Class。 1.装载 Class文件 – 二进制字节流 --类加载器 1通过一个类的全限定名获取这个类的二进制字节流 2将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构 3在java堆中生成一个代表这个类的java.lang.Class对象做为我们方法区的数据访问入口 2.链接 1验证保证我们加载的类的正确性 文件格式验证元数据验证字节码验证符号引用验证 2准备 为类的静态变量分配内存并将其初始化为当前类型的默认值。 private static int a 1 那么他在准备这个阶段 a 0 3解析 解析是从运行时常量池中的符号引用动态确定具体值的过程。 把类中的符号引用转换成直接引用 3.初始化 执行到Clinit方法为静态变量赋值初始化静态代码块初始化当前类的父类 5.类加载器的层次 6.双亲委派机制 父类委托机制 源码 String 自己写 String protected Class? loadClass(String name, boolean resolve)throws ClassNotFoundException{synchronized (getClassLoadingLock(name)) {// First, check if the class has already been loadedClass? c findLoadedClass(name);if (c null) {long t0 System.nanoTime();try {if (parent ! null) {c parent.loadClass(name, false);} else {c findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c null) {// If still not found, then invoke findClass in order// to find the class.long t1 System.nanoTime();c findClass(name);// this is the defining class loader; record the statssun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);sun.misc.PerfCounter.getFindClasses().increment();}}if (resolve) {resolveClass(c);}return c;}7.如何打破双亲委派 1.复写 2.SPI Service Provider Interface 服务提供接口 日志 Xml解析 JBDC 可拔插设计 可以随时替换实现 3.OSGI 热部署 热更新 8.运行时数据区 1.方法区 线程共享 方法区是逻辑上堆的一部分 所以他有个名字非堆 运行时常量池、字段和方法数据以及方法和构造函数的代码包括类和实例初始化和接口初始化中使用 的特殊方法 如果方法区域中的内存无法满足分配请求Java 虚拟机将抛出一个 OutOfMemoryError 2.堆 线程共享 堆是为所有类实例和数组分配内存的运行时数据区域 内存不足 OutOfMemoryError 3.java虚拟机栈 执行java方法的 线程私有的 StackOverflowError 4.本地方法栈 执行本地方法 线程私有 StackOverflowError 5.程序计数器 记录程序执行到的位置 线程私有 9.栈帧结构是什么样子的 附加信息栈帧的高度虚拟机版本信息 栈帧信息附加信息动态链接方法的返回地址 局部变量表方法中定义的局部变量以及方法的参数都会存放在这张表中 单纯的存储单元 操作数栈 以压栈以及出栈的方式存储操作数 举例 int a 1 int b 1 int c a b 方法的返回地址当你一个方法执行的时候只有两种方式可以推出 1.遇到方法的返回的字节码指令 2.出现了异常有异常处理器则交给异常处理器 没有呢抛异常 10.动态链接 动态链接是为了支持方法的动态调用过程 。 动态链接将这些符号方法引用转换为具体的方法引用 符号引用转变为直接引用 为了支持java的多态 void a(){ b(); } void b(){ c(); } void c(){ } 11.java堆为什么要进行分代设计 新老年代划分 Eden区与S区 12.为什么EdenS0S1 是811! 98%的对象朝生夕死13.对象的创建过程 14.方法区与元数据区以及持久代到底是什么关系 方法区 JVM规范 落地JDK1.7之前 持久代 Perm Space JVM虚拟机自己的内存 JDK1.8之后 元数据区 / 元空间 MetaSpace 直接内存 15.什么时候才会进行垃圾回收 GC是由JVM自动完成的根据JVM系统环境而定所以时机是不确定的。 当然我们可以手动进行垃圾回收比如调用System.gc()方法通知JVM进行一次垃圾回收但是 具体什么时刻运行也无法控制。也就是说System.gc()只是通知要回收什么时候回收由JVM决 定。但是不建议手动调用该方法因为GC消耗的资源比较大。 1当Eden区或者S区不够用了 2老年代空间不够用了 3方法区空间不够用了 4System.gc() //通知 时机也不确定 执行的Full GC16. 如何确定一个对象是垃圾 要想进行垃圾回收得先知道什么样的对象是垃圾。 引用计数法 对于某个对象而言只要应用程序中持有该对象的引用就说明该对象不是垃圾如果一个对象没有任何指针对其引用它就是垃圾。 弊端:如果AB相互持有引用导致永远不能被回收。 循环引用 内存泄露 --内存溢出 可达性分析/根搜索算法 通过GC Root的对象开始向下寻找看某个对象是否可达 能作为GC Root:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等。 虚拟机栈栈帧中的本地变量表中引用的对象。 方法区中类静态属性引用的对象。 方法区中常量引用的对象。 本地方法栈中JNI即一般说的Native方法引用的对象。18.对象被判定为不可达对象之后就“死”了吗 垃圾收集算法 已经能够确定一个对象为垃圾之后接下来要考虑的就是回收怎么回收呢得要有对应的算法下面介绍常见的垃圾回收算法。高效 健壮 标记-清除(Mark-Sweep) 标记 找出内存中需要回收的对象并且把它们标记出来 此时堆中所有的对象都会被扫描一遍从而才能确定需要回收的对象比较耗时 清除 清除掉被标记需要回收的对象释放出对应的内存空间 缺点 标记清除之后会产生大量不连续的内存碎片空间碎片太多可能会导致以后在程 序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。 (1)标记和清除两个过程都比较耗时效率不高 (2)会产生大量不连续的内存碎片空间碎片太多可能会导致以后在程序运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。标记-复制(Mark-Copying) 将内存划分为两块相等的区域每次只使用其中一块如下图所示 当其中一块内存使用完了就将还存活的对象复制到另外一块上面然后把已经使用过的内存空间一次清除掉。 缺点:空间利用率降低。 标记-整理(Mark-Compact) 复制收集算法在对象存活率较高时就要进行较多的复制操作效率将会变低。更关键的是如果不想浪费50%的空间就需要有额外的空间进行分配担保以应对被使用的内存中所有对象都有100%存活的极端情况所以老年代一般不能直接选用这种算法。 标记过程仍然与标记-清除算法一样但是后续步骤不是直接对可回收对象进行清理而是让所有存活的对象都向一端移动然后直接清理掉端边界以外的内存。 其实上述过程相对复制算法来讲少了一个保留区 让所有存活的对象都向一端移动清理掉边界意外的内存。 分代收集算法 既然上面介绍了3中垃圾收集算法那么在堆内存中到底用哪一个呢 Young区复制算法(对象在被分配之后可能生命周期比较短Young区复制效率比较高) Old区标记清除或标记整理(Old区对象存活时间比较长复制来复制去没必要不如做个标记再清理) 垃圾收集器 如果说收集算法是内存回收的方法论那么垃圾收集器就是内存回收的具体实现。 Serial Serial收集器是最基本、发展历史最悠久的收集器曾经在JDK1.3.1之前是虚拟机新生代收集的唯一选择。 它是一种单线程收集器不仅仅意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作更重要的是其在进行垃圾收集的时候需要暂停其他线程。 优点简单高效拥有很高的单线程收集效率 缺点收集过程需要暂停所有线程 算法复制算法 适用范围新生代 应用Client模式下的默认新生代收集器Serial Old Serial Old收集器是Serial收集器的老年代版本也是一个单线程收集器不同的是采用标记-整理算法运行过程和Serial收集器一样。 ParNew 可以把这个收集器理解为Serial收集器的多线程版本。 优点在多CPU时比Serial效率高。 缺点收集过程暂停所有应用程序线程单CPU时比Serial效率差。 算法复制算法 适用范围新生代 应用运行在Server模式下的虚拟机中首选的新生代收集器Parallel Scavenge Parallel Scavenge收集器是一个新生代收集器它也是使用复制算法的收集器又是并行的多线程收集器看上去和ParNew一样但是Parallel Scanvenge更关注系统的吞吐量。 吞吐量运行用户代码的时间/(运行用户代码的时间垃圾收集时间) 比如虚拟机总共运行了100分钟垃圾收集时间用了1分钟吞吐量(100-1)/10099%。 若吞吐量越大意味着垃圾收集的时间越短则用户代码可以充分利用CPU资源尽快完成程序的运算任务。 -XX:MaxGCPauseMillis控制最大的垃圾收集停顿时间 -XX:GCRatio直接设置吞吐量的大小。Parallel Old Parallel Old收集器是Parallel Scavenge收集器的老年代版本使用多线程和标记-整理算法进行垃圾回收也是更加关注系统的吞吐量。 CMS 官网 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/cms.html#concurrent_mark_sweep_cms_collector CMS(Concurrent Mark Sweep)收集器是一种以获取 最短回收停顿时间为目标的收集器。 采用的是标记-清除算法,整个过程分为4步 (1)初始标记 CMS initial mark 标记GC Roots直接关联对象不用Tracing速度很快 (2)并发标记 CMS concurrent mark 进行GC Roots Tracing (3)重新标记 CMS remark 修改并发标记因用户程序变动的内容 (4)并发清除 CMS concurrent sweep 清除不可达对象回收空间同时有新垃圾产生留着下次清理称为浮动垃圾由于整个过程中并发标记和并发清除收集器线程可以与用户线程一起工作所以总体上来说CMS收集器的内存回收过程是与用户线程一起并发地执行的。 优点并发收集、低停顿 缺点产生大量空间碎片、并发阶段会降低吞吐量G1(Garbage-First) 官网 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/g1_gc.html#garbage_first_garbage_collection **使用G1收集器时Java堆的内存布局与就与其他收集器有很大差别它将整个Java堆划分为多个大小相等的独立区域Region虽然还保留有新生代和老年代的概念但新生代和老年代不再是物理隔离的了它们都是一部分Region不需要连续的集合。 ** 每个Region大小都是一样的可以是1M到32M之间的数值但是必须保证是2的n次幂 如果对象太大一个Region放不下[超过Region大小的50%]那么就会直接放到H中 设置Region大小-XX:G1HeapRegionSizeM 所谓Garbage-Frist其实就是优先回收垃圾最多的Region区域 1分代收集仍然保留了分代的概念 2空间整合整体上属于“标记-整理”算法不会导致空间碎片 3可预测的停顿比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内消耗在垃圾收集上的时间不得超过N毫秒工作过程可以分为如下几步 初始标记Initial Marking 标记以下GC Roots能够关联的对象并且修改TAMS的值需要暂停用户线程 并发标记Concurrent Marking 从GC Roots进行可达性分析找出存活的对象与用户线程并发执行 最终标记Final Marking 修正在并发标记阶段因为用户程序的并发执行导致变动的数据需暂停用户线程 筛选回收Live Data Counting and Evacuation 对各个Region的回收价值和成本进行排序根据用户所期望的GC停顿时间制定回收计划ZGC 官网 https://docs.oracle.com/en/java/javase/11/gctuning/z-garbage-collector1.html#GUID-A5A42691-095E-47BA-B6DC-FB4E5FAA43D0 JDK11新引入的ZGC收集器不管是物理上还是逻辑上ZGC中已经不存在新老年代的概念了 会分为一个个page当进行GC操作时会对page进行压缩因此没有碎片问题 只能在64位的linux上使用目前用得还比较少 1可以达到10ms以内的停顿时间要求 2支持TB级别的内存 3堆内存变大后停顿时间还是在10ms以内 垃圾收集器分类 串行收集器-Serial和Serial Old 只能有一个垃圾回收线程执行用户线程暂停。 适用于内存比较小的嵌入式设备。 并行收集器[吞吐量优先]-Parallel Scanvenge、Parallel Old、ParNeww 多条垃圾收集线程并行工作但此时用户线程仍然处于等待状态。 适用于科学计算、后台处理等若交互场景。 并发收集器[停顿时间优先]-CMS、G1、ZGC 用户线程和垃圾收集线程同时执行(但并不一定是并行的可能是交替执行的)垃圾收集线程在执行的时候不会停顿用户线程的运行。 适用于相对时间有要求的场景比如Web。 吞吐量和停顿时间 **停顿时间-垃圾收集器 **进行 垃圾回收终端应用执行响应的时间吞吐量-运行用户代码时间/(运行用户代码时间垃圾收集时间) 停顿时间越短就越适合需要和用户交互的程序良好的响应速度能提升用户体验 高吞吐量则可以高效地利用CPU时间尽快完成程序的运算任务主要适合在后台运算而不需要太多交互的任务。小结:这两个指标也是评价垃圾回收器好处的标准。 生产环境中如何选择合适的垃圾收集器 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html#sthref28 优先调整堆的大小让服务器自己来选择如果内存小于100M使用串行收集器如果是单核并且没有停顿时间要求使用串行或JVM自己选如果允许停顿时间超过1秒选择并行或JVM自己选如果响应时间最重要并且不能超过1秒使用并发收集器 如何判断是否使用G1垃圾收集器 https://docs.oracle.com/javase/8/docs/technotes/guides/vm/G1.html#use_cases JDK 7开始使用JDK 8非常成熟JDK 9默认的垃圾收集器适用于新老生代。 是否使用G1收集器 150%以上的堆被存活对象占用 2对象分配和晋升的速度变化非常大 3垃圾回收时间比较长JVM常用命令 jps 查看java进程 The jps command lists the instrumented Java HotSpot VMs on the target system. The command is limited to reporting information on JVMs for which it has the access permissions.jinfo 1实时查看和调整JVM配置参数 The jinfo command prints Java configuration information for a specified Java process or core file or a remote debug server. The configuration information includes Java system properties and Java Virtual Machine (JVM) command-line flags.2查看用法 jinfo -flag name PID 查看某个java进程的name属性的值 jinfo -flag MaxHeapSize PID jinfo -flag UseG1GC PID3修改 参数只有被标记为manageable的flags可以被实时修改 jinfo -flag [|-] PID jinfo -flag namevalue PID4查看曾经赋过值的一些参数 jinfo -flags PIDjstat 1查看虚拟机性能统计信息 The jstat command displays performance statistics for an instrumented Java HotSpot VM. The target JVM is identified by its virtual machine identifier, or vmid option.2查看类装载信息 jstat -class PID 1000 10 查看某个java进程的类装载信息每1000毫秒输出一次共输出10次3查看垃圾收集信息 jstat -gc PID 1000 10jstack 1查看线程堆栈信息 The jstack command prints Java stack traces of Java threads for a specified Java process, core file, or remote debug server.2用法 jstack PIDJVM死锁情况分析 //运行主类 public class DeadLockDemo {public static void main(String[] args){DeadLock d1new DeadLock(true);DeadLock d2new DeadLock(false);Thread t1new Thread(d1);Thread t2new Thread(d2);t1.start();t2.start();} } //定义锁对象 class MyLock{public static Object obj1new Object();public static Object obj2new Object(); } //死锁代码 class DeadLock implements Runnable{private boolean flag;DeadLock(boolean flag){this.flagflag;}public void run() {if(flag) {while(true) {synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()----if获得obj1锁);synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()----if获得obj2锁);}}}}else {while(true){synchronized(MyLock.obj2) {System.out.println(Thread.currentThread().getName()----否则获得obj2锁);synchronized(MyLock.obj1) {System.out.println(Thread.currentThread().getName()----否则获得obj1锁);}}}}} }jmap 1生成堆转储快照 The jmap command prints shared object memory maps or heap memory details of a specified process, core file, or remote debug server.2打印出堆内存相关信息 jmap -heap PIDjinfo -flag UsePSAdaptiveSurvivorSizePolicy 35352 -XX:SurvivorRatio8G1调优策略 1不要手动设置新生代和老年代的大小只要设置整个堆的大小 whyhttps://blogs.oracle.com/poonam/increased-heap-usage-with-g1-gc G1收集器在运行过程中会自己调整新生代和老年代的大小 其实是通过adapt代的大小来调整对象晋升的速度和年龄从而达到为收集器设置的暂停时间目标 如果手动设置了大小就意味着放弃了G1的自动调优2不断调优暂停时间目标 一般情况下这个值设置到100ms或者200ms都是可以的(不同情况下会不一样)但如果设置成50ms就不太合理。暂停时间设置的太短就会导致出现G1跟不上垃圾产生的速度。最终退化成Full GC。所以对这个参数的调优是一个持续的过程逐步调整到最佳状态。暂停时间只是一个目标并不能总是得到满足。3使用-XX:ConcGCThreadsn来增加标记线程的数量 IHOP如果阀值设置过高可能会遇到转移失败的风险比如对象进行转移时空间不足。如果阀值设置过低就会使标记周期运行过于频繁并且有可能混合收集期回收不到空间。 IHOP值如果设置合理但是在并发周期时间过长时可以尝试增加并发线程数调高ConcGCThreads。**4MixedGC调优 ** -XX:InitiatingHeapOccupancyPercent -XX:G1MixedGCLiveThresholdPercent -XX:G1MixedGCCountTarger -XX:G1OldCSetRegionThresholdPercent5适当增加堆内存大小 6不正常的Full GC 有时候会发现系统刚刚启动的时候就会发生一次Full GC但是老年代空间比较充足一般是由Metaspace区域引起的。可以通过MetaspaceSize适当增加其大家比如256M。JVM性能优化指南
http://www.w-s-a.com/news/799173/

相关文章:

  • 公司网站平台vs2012网站开发课程设计
  • 哪些方法可以建设网站做网站失败
  • 龙岗网站建设技术wordpress左右两栏
  • 电子商务网站开发与应用的介绍怎么查询域名是否备案
  • 想做一个自己设计公司的网站怎么做的权威发布型舆情回应
  • 做ppt用的音效网站python基础教程网易
  • 可以做免费广告的网站有哪些做视频赚钱的国外网站
  • 苏州做物流网站电话郑州网站高端网站设计
  • 网站建设音乐插件怎么弄wordpress添加数据库文件
  • 汽车行业做网站福建省第二电力建设公司网站
  • delphi做网站开发商城网站建设价位
  • 网站宣传片3 阐述网站建设的步骤过程 9分
  • 公司网站怎么做站外链接哪里有做胎儿dna亲子鉴定
  • 潍坊做电商的网站建设wordpress 特效主题
  • 做网站和app哪个难公司网上注册系统
  • 关于网站建设外文文献系部网站建设
  • 高端设计网站都有哪些月付网站空间提供商
  • 家政 东莞网站建设优化设计官方电子版
  • 做网站如何使用网页插件上海造价信息网
  • 承德网站制作加盟天津做优化的网站有多少家
  • 北京市保障性住建设投资中心网站首页专业做网站联系电话
  • 镇江网站建设方式优化单页面网站教程
  • 做手机网站公司北京网页设计公司兴田德润实惠
  • 域名申请好了 要怎么做网站百度推广开户渠道
  • 电商网站建设 数商云焦作黄河交通学院
  • 做一个网站成本多少太原网站维护
  • 网站建设制作设计优化怎么制作网页步骤
  • 花都区pc端网站建设画册设计多少钱一页
  • 国外买域名的网站廊坊网站制作网页
  • 抚顺市城市建设档案馆网站制作网页时经常用的一种动态位图格式是