JVM虚拟机

 

 

 

 

 

 

 

垃圾什么时候被回收

2、是怎么回收的呢

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JVM Server模式与client模式启动的差别?

 

最主要的差别在于:-Server模式启动时,速度较慢,但是一旦运行起来后,性能将会有很大的提升.原因是:

 

当虚拟机运行在-client模式的时候,使用的是一个代号为C1的轻量级编译器, 而-server模式启动的虚拟机采用相对重量级,代号为C2的编译器. C2比C1编译器编译的相对彻底,,服务起来之后,性能更高.

 

所以通常用于做服务器的时候我们用服务端模式,如果你的电脑只是运行一下java程序,就客户端模式就可以了。当然这些都是我们做程序优化程序才需要这些东西的,普通人并不关注这些专业的东西了。其实服务器模式即使编译更彻底,然后垃圾回收优化更好,这当然吃的内存要多点相对于客户端模式。

 

 

 

怎么修改JVM的启动模式呢?

 

64位系统默认在 JAVA_HOME/jre/lib/amd64/jvm.cfg

 

32在目录JAVA_HOME/jre/lib/i386/jvm.cfg

 

我的配置是这样的,所以是已服务器模式启动的,当然,你想换成client模式的话,把两个对调一下就可以了。

 

#

-server KNOWN

-client IGNORE

 

 

 

当然,我们做开发,安装jdk的时候直接安装服务器模式就没有是很好的习惯了。。。。。。

 

    • Java有哪些分区,运行时数据区模拟
      • 线程私有:【程序计数器,Java 虚拟机栈,本地方法栈】
        • 程序计数器:根据这个值来取下一条指令。如果正在执行Java方法,记录正在执行的虚拟机字节码指令地址。如果正在执行native方法(java调用非java代码的接口),则为空。
        • Java 虚拟机栈:存放的是一个一个的栈帧,每一个栈帧对应一个被调用的方法。存储局部变量表、操作数栈、动态链接、方法出口信息。(局部变量部分)为虚拟机执行Java方法服务。
        • 本地方法栈:为虚拟机执行native方法服务。
    • 公有:【堆,方法区】
      • JVM 中只有一个堆。最大。可以处于不连续空间中。存放对象实例。GC区。由于现在收集器基本都采用分代收集算法,分为新生代和老年代
      • 方法区【永久代】中最重要的是运行时常量池(存储编译期生成的各种字面量和符号引用)。不需要连续内存,很少垃圾回收。存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。
    • 直接内存
      • NIO类通过Native函数库直接分配堆外内存,通过存储在Java堆中的DirectByteBuffer对象引用这块内存。能避免Java堆和native堆复制数据,提高性能。
    • JVM 内存模型。
      • java的内存管理和内存释放。为什么要这么分?单线程还需要这么划分吗?1.8的方法区的改进。
        • 多线程是通过线程之间轮流切换,并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。因此,为了线程切换后能够恢复到正确的执行位置,每条线程都要有一个独立的程序计数器,各进程之间互不影响,独立存储。
    • volatile告诉内存模型是什么语义
    • 内存溢出一般发生在哪个区?永久代会不会导致内存溢出?
    • 堆和栈
    • 哪些情况下用栈
    • 栈空间太大/小会怎样?
    • 如何查看堆内存信息?
    • 出现OOM怎么排查问题?
    • 堆和栈区别,堆、栈分别存储什么信息?
    • 栈空间太大/小会怎样?
    • 如何查看堆内存信息?
    • JVM栈溢出,堆溢出
    • 栈会不会溢出?栈溢出一般抛什么异常?jvm在哪里设置栈的大小?设置的参数是什么?
    • 用过哪些命令查看jvm的状态、堆栈信息?
    •  
      • 垃圾回收机制
    • (确认对象存活)+垃圾回收算法
    • 永久代的垃圾回收:方法区可以实现GC吗
    • 垃圾回收算法有哪几种?根搜索算法解释一下?再说说分别都在哪里用到?
      • 分代收集算法
        • 现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适 当的收集算法。
        • 一般将堆分为新生代和老年代。
      • 标记-清除【老年代会用】
        • 将存活的对象进行标记,然后清理掉未被标记的对象。
          • 标记和清除过程效率都不高; 
          • 会产生大量不连续的内存碎片,导致无法给大对象分配内存。
      • 标记-整理【适合老年代】
        • 让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
      • 复制【适合新生代】
        • 将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象 复制到另一块上面,然后再把使用过的内存空间进行一次清理。
        • 主要不足是只使用了内存的一半。
    • 现在的商业虚拟机都采用这种收集算法来回收新生代,将新生代分为一块较大的 Eden 空间和两块较小的Survivor 空间,每次使用 Eden 空间和 其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另一块 Survivor 空间上,最后清理 Eden 和使用过的那一块 Survivor。
    • HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要 依赖于老年代进行分配担保,也就是借用老年代的空间存储放不下的对象。
    • 垃圾收集器
    • Serial【新生代】
      • 单线程、串行(与用户线程交替执行、执行时暂停所有用户进程)
      • 新生代:复制。老生代:标记-整理。
      • 优点是简单高效,对于单个 CPU 环境来说,由于没有线程交互的开销,因此拥有最高的单线程收集效率。
      • 是 Client 模式下的默认新生代收集器,因为在该应用场景下,分配给虚拟机管理的内存一般来说不会很大。Serial 收集器收集几十兆甚至一两百兆的新生代停顿时间可以控制在一百多毫秒以内,只要不是太频繁,这点停顿是可以接受的。
    • ParNew【新生代】
      • Serial的多线程版本、串行
      • 新生代:复制。老生代:标记-整理。
      • 是Server模式下的虚拟机首选新生代收集器,除了性能原因外,主要是因为除了 Serial 收集器,只有它能与 CMS 收集器配合工作。
      • 默认开启的线程数量与 CPU 数量相同,可以使用 -XX:ParallelGCThreads 参数来设置线程数。
    • Parallel Scavenge 【新生代】
      • 多线程,串行。
      • 仅用于新生代,复制。
      • 其它收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,它被称为“吞吐量优先”收集器。吞吐量指CPU 用于运行用户代码的时间,占总时间的比值。
      • 停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
      • 高吞吐量=长停顿时间。缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。
      • 可以通过一个开关参数打开 GC 自适应调节策略(GC Ergonomics),就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 区的比例、晋升老年代对象年龄等细节参数了。 虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量。
    • Serial Old【老年代】
      • 单线程 & 标记-整理。串行
      • 是 Serial 收集器的老年代版本,也是给 Client 模式下的虚拟机使用。如果用在 Server 模式 下,它有两大用途:
        • 在 JDK 1.5 以及之前版本(Parallel Old 诞生以前)中与Parallel Scavenge 收集器搭配使用。
        • 作为 CMS 收集器的后备预案,在并发收集发生 Concurrent Mode Failure 时使用。
    • Parallel Old【老年代】
      • 多线程 & 标记-整理。串行
      • 是 Parallel Scavenge 收集器的老年代版本。
      • 在注重吞吐量以及 CPU 资源敏感的场合,都可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器。
    • CMS【老年代】
      • 目标:最短停顿时间。
      • CMS(Concurrent Mark Sweep),标记-清除算法。 分为以下四个流程:
        • 初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
        • 并发标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。 
        • 重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
        • 并发清除:不需要停顿。
        • 在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。
      • 缺点:
        • 吞吐量低:低停顿时间是以牺牲吞吐量为代价的,导致 CPU 利用率不够高。 
        • 无法处理浮动垃圾,可能出现 Concurrent Mode Failure。浮动垃圾是指并发清除阶段由 于用户线程继续运行而产生的垃圾,这部分垃圾只能到下一次 GC 时才能进行回收。由于浮动垃圾的存在,因此需要预留出一部分内存,意味着 CMS 收集不能像其它收集器那样等待老年代快满的时候再回收。如果预留的内存不够存放浮动垃圾,就会出现 Concurrent Mode Failure,这时虚拟机将临时启用 Serial Old 来替代 CMS。 
        • 标记 - 清除算法导致的空间碎片,往往出现老年代空间剩余,但无法找到足够大连续空间来分配当前对象,不得不提前触发一次 Full GC。
    • G1 【新生代+老年代】
      • G1(Garbage-First),面向服务端应用,在多 CPU 和大内存的场景下有很好的性能。
      • 把堆划分成多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
      • 每个小空间可以单独进行垃圾回收,这种划分方法带来了很大的灵活性,使得可预测的停顿时间模型成为可能。通过记录每个 Region 垃圾回收时间,以及回收所获得的空间,(过去回收的经验获得),维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的 Region。
      • 每个 Region 都有一个 Remembered Set,用来记录该 Region 对象的引用对象所在的 Region。通过使用 Remembered Set,在做可达性分析的时候就可以避免全堆扫描。
        • 初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
        • 并发标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
        • 最终标记:为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程的 Remembered Set Logs 里面,最终标记阶段需要把 Remembered Set Logs 的数据合并到Remembered Set 中。这阶段需要停顿线程,但是可并行执行。
        • 筛选回收:首先对各个 Region 中的回收价值和成本进行排序,根据用户所期望的GC 停 顿时间来制定回收计划。此阶段其实也可以做到与用户程序一起并发执行,但是因为只回 收一部分 Region,时间是用户可控制的,而且停顿用户线程将大幅度提高收集效率。
      • 、特点:
        • 空间整合:整体来看是基于“标记 - 整理”算法实现的收集器,从局部(两个 Region 之间)上来看是基于“复制”算法实现的,这意味着运行期间不会产生内存空间碎片。
        • 可预测的停顿:能让使用者明确指定在一个长度为 M 毫秒的时间片段内,消耗在GC 上的时间不得超过 N 毫秒。
    •  
    • 内存分配与垃圾回收策略
    • HotSpot有哪些常见的垃圾收集器,CMS相对其他收集器的优势是什么?(低停顿),怎么做到低停顿
    • 垃圾回收算法的好处
    • 对象如何进入老年代
    • 设计一种针对老年代的回收方法
    •  
    • GC什么时候开始?我调用System.gc()能保证GC一定发生吗?
    •  
    • jvm虚拟机老年代什么情况下会发生gc。给你一个场景,一台4核8G的服务器,每隔两个小时就要出现一次老年代gc,现在有日志,怎么分析是哪里出了问题?
    • 谈谈GC,CMS的流程,新生代老生代分别用什么算法
    • G1和CMS的区别
    • 说一下新生代和永久代有什么关系?
    • 用过什么JVM调优命令,常见的调优方法
    • 问我gc,回答的还行,但没有说g1,应该加上去的。
    • jvm如何判断是字节码文件
    • 类加载机制,class文件具体加载过程
    • 谈谈类加载器,类加载器有哪些
    • 如何实现自定义类加载器?
    • 类初始化五种情况
    •  
    • JVM的加载机制是什么模式?为什么要使用双亲委派模型?我回答的是性能,除了性能有什么其他原因?
    • 三种加载器(双亲委派) 三种加载器怎么协同工作?
    • 双亲委派模型
    • 加载器双亲委派模型及破坏
    • 双亲委派最终是由父还是子加载
    • 双亲委派类加载模型,可以加载自定义的String类吗?如何实现?
    •  
    • findClass与loadClass的区别?
    •  
    • 存储引擎的区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值