日本黄区免费视频观看最小的Metaspace剩余空间容量的百分比

  • 首页
  • 免费观 看成人网站
  • 将粗大挺进邻居人妻
  • 亚洲国产成人AV线
  • 伊人狼人大蕉香AV
  • 行房时间短怎么治
  • 日本黄区免费视频观看最小的Metaspace剩余空间容量的百分比
    发布日期:2022-09-23 06:19    点击次数:69
    坐着一侧屁股疼腿疼日本黄区免费视频观看

    弁言

    整理了10个经典又容易被果决的JVM口试题,谢谢阅读,群众加油哈

    github地址,感谢每颗star

    https://github.com/whx123/JavaHome

    1. 对象一定分派在堆中吗?有莫得了解逃遁分析时代?

    「对象一定分派在堆中吗?」 不一定的,JVM通过「逃遁分析」,那些逃不出顺次的对象会在栈上分派。

    「什么是逃遁分析?」

    逃遁分析(Escape Analysis),是一种不错有用减少Java 体式中同步负载和内存堆分派压力的跨函数全局数据流分析算法。通过逃遁分析,Java Hotspot编译器大致分析出一个新的对象的援用的使用范围,从而决定是否要将这个对象分派到堆上。

    逃遁分析是指分析指针动态范围的顺次,它同编译器优化旨趣的指针分析和外形分析干系联。当变量(或者对象)在顺次均分派后,其指针有可能被复返或者被全局援用,这么就会被其他顺次或者线程所援用,这种征象称作指针(或者援用)的逃遁(Escape)。等闲点讲,如果一个对象的指针被多个顺次或者线程援用时,那么咱们就称这个对象的指针发生了逃遁。

    「一个逃遁分析的例子」

    /**  *  @author 捡田螺的小男孩  */ public class EscapeAnalysisTest {      public static Object object;      //StringBuilder可能被其他顺次改变,逃遁到了顺次外部。     public StringBuilder  escape(String a, String b) {         //公众号:捡田螺的小男孩         StringBuilder str = new StringBuilder();         str.append(a);         str.append(b);         return str;     }      //不径直复返StringBuffer,不发生逃遁     public String notEscape(String a, String b) {         //公众号:捡田螺的小男孩         StringBuilder str = new StringBuilder();         str.append(a);         str.append(b);         return str.toString();     }      //外部线程可见object,发生逃遁     public void objectEscape(){         object = new Object();     }      //仅顺次里面可见,不发生逃遁     public void objectNotEscape(){         Object object = new Object();     } } 

    「逃遁分析的刚正」

    栈上分派,不错缩短垃圾汇注器运行的频率。 同步放手,如果发现某个对象只可从一个线程可走访,那么在这个对象上的操作不错不需要同步。 标量替换,把对象瓦解成一个个基本类型,况兼内存分派不再是分派在堆上,而是分派在栈上。这么的刚正有,一、减少内存使用,因为不必生成对象头。二、体式内存回班师率高,况兼GC频率也会减少。

    2.假造机为什么使用元空间替换了永久代?

    「什么是元空间?什么是永久代?为什么用元空间代替永久代?」 咱们先纪念一下「顺次区」吧,望望假造机运行时数据内存图,如下:

    顺次区和堆通常,是各个线程分享的内存区域,它用于存储已被假造机加载的类信息、常量、静态变量、即时编译后的代码等数据。

    「什么是永久代?它慈祥序区有什么关系呢?」

    如果在HotSpot假造机上开辟、部署,许多体式员都把顺次区称作永久代。不错说顺次区是范例,永久代是Hotspot针对该范例进行的齐全。在Java7及往常的版块,顺次区都是永久代齐全的。

    「什么是元空间?它慈祥序区有什么关系呢?」

    关于Java8,HotSpots取消了永久代,拔旗易帜的是元空间(Metaspace)。换句话说,即是顺次区已经在的,只是齐全变了,从永久代变为元空间了。

    「为什么使用元空间替换了永久代?」

    永久代的顺次区,和堆使用的物理内存是邻接的。

    「永久代」是通过以下这两个参数成立大小的~

    -XX:PremSize:建筑永久代的开动大小 -XX:MaxPermSize: 建筑永久代的最大值,默许是64M

    关于「永久代」,如果动态生成许多class的话,就很可能出现「java.lang.OutOfMemoryError: PermGen space罪状」,因为永久代空间成立有限嘛。最典型的场景是,在web开辟比拟多jsp页面的时候。

    JDK8之后,顺次区存在于元空间(Metaspace)。物理内存不再与堆邻接,而是径直存在于腹地内存中,表面上机器「内存有多大,元空间就有多大」。

    不错通过以下的参数来建筑元空间的大小:

    -XX:MetaspaceSize,开动空间大小,达到该值就会触发垃圾汇注进行类型卸载,同期GC会对该值进行调整:如果开释了多数的空间,就符合缩短该值;如果开释了很少的空间,那么在不进步MaxMetaspaceSize时,符合栽种该值。 -XX:MaxMetaspaceSize,最大空间,默许是莫得划定的。 -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分派空间所导致的垃圾汇注 -XX:MaxMetaspaceFreeRatio,在GC之后, 熟妇最大的Metaspace剩余空间容量的百分比,减少为开释空间所导致的垃圾汇注

    「是以,为什么使用元空间替换永久代?」

    名义上看是为了幸免OOM相当。因为浅近使用PermSize和MaxPermSize建筑永久代的大小就决定了永久代的上限,可是不是总能披露应该建筑为多大合适, 如果使用默许值很容易遭遇OOM罪状。当使用元空间时,不错加载些许类的元数据就不再由MaxPermSize适度, 而由系统的骨子可用空间来适度啦。

    3.什么是Stop The World ? 什么是OopMap?什么是安全点?

    进行垃圾回收的历程中,会触及对象的搬动。为了保证对象援用更新的正确性,必须暂停扫数的用户线程,像这么的停顿,假造机假想者形象描绘为「Stop The World」。

    在HotSpot中,有个数据结构(映射表)称为「OopMap」。一朝类加载动作完成的时候,HotSpot就会把对象内什么偏移量上是什么类型的数据谋划出来,纪录到OopMap。在即时编译历程中,也会在「特定的位置」生成 OopMap,纪录下栈上和寄存器里哪些位置是援用。

    这些特定的位置主要在:

    1.轮回的末尾(非 counted 轮回) 2.顺次临复返前 / 调用顺次的call辅导后 3.可能抛相当的位置

    这些位置就叫作「安全点(safepoint)。」 用户体式实行时并非在代码辅导流的任性位置都大致在停顿下来脱手垃圾汇注,而是必须是实行到安全点才大致暂停。

    4.说一下JVM 的主要构成部分偏执作用?

    JVM包含两个子系统和两个组件,分别为

    Class loader(类装载子系统) Execution engine(实行引擎子系统); Runtime data area(运行时数据区组件) Native Interface(腹地接口组件)。 「Class loader(类装载):」 左证给定的全落幕名类名(如:java.lang.Object)来装载class文献到运行时数据区的顺次区中。 「Execution engine(实行引擎)」:实行class的辅导。 「Native Interface(腹地接口):」 与native lib交互,是其它编程谈话交互的接口。 「Runtime data area(运行时数据区域)」:即咱们常说的JVM的内存。

    最初通过编译器把 Java源代码迁徙成字节码,Class loader(类装载)再把字节码加载到内存中,将其放在运行时数据区的顺次区内,而字节码文献只是 JVM 的一套辅导集范例,并不行径直交给底层操作系统去实行,因此需要特定的呐喊领略器实行引擎(Execution Engine),将字节码翻译成底层系统辅导,再交由 CPU 去实行,而这个历程中需要调用其他谈话的腹地库接口(Native Interface)来齐全致个体式的功能。

    5. 防守线程是什么?防守线程和非防守线程的区别是?防守线程的作用是?

    「防守线程」是区别于用户线程哈,「用户线程」即咱们手动创建的线程,而防守线程是体式运行的时候在后台提供一种「通用行状的线程」。垃圾回收线程即是典型的防守线程。

    「防守线程和非防守线程的区别是?」 咱们通过例子来看吧~

    /**      * 眷注公众号:捡田螺的小男孩      */    public static void main(String[] args) throws InterruptedException {        Thread t1 = new Thread(()-> {                while (true) {                    try {                        Thread.sleep(1000);                        System.out.println("我是子线程(用户线程.I am running");                    } catch (Exception e) {                    }                }        });        //标记为防守线程        t1.setDaemon(true);        //启动线程        t1.start();         Thread.sleep(3000);        System.out.println("干线程实行收场...");    } 

    运行落幕:

    不错发现标记为防守线程后,「干线程葬送住手,防守线程通盘葬送」。咱们再看下,永久成人网站免费去掉 t1.setDaemon(true)防守标记的恶果:

    public static void main(String[] args) throws InterruptedException {       Thread t1 = new Thread(()-> {               while (true) {                   try {                       Thread.sleep(1000);                       System.out.println("我是子线程(用户线程.I am running");                   } catch (Exception e) {                   }               }       });       //启动线程       t1.start();        Thread.sleep(3000);       System.out.println("干线程实行收场...");   } 

    是以,当干线程退出时,JVM 也随着退出运行,防守线程同期也会被回收,即使是死轮回。如果是用户线程,它会一直停在死轮回跑。这即是「防守线程和非防守线程的区别」啦。

    防守线程领有「自动落幕我方人命周期的秉性」,非防守线程却莫得。如果垃圾回收线程曲直防守线程,当JVM 要退出时,由于垃圾回收线程还在运行着,导致体式无法退出,这就很痛苦。这即是「为什么垃圾回收线程需如若防守线程啦」。

    6.WeakHashMap了解过嘛?它是怎样责任的?

    「WeakHashMap」 肖似HashMap ,不同点在WeakHashMap的key是「弱援用」的key。

    谈到「弱援用」,在这里纪念下四种援用吧

    强援用:Object obj=new Object()这种,只好强援用关系还存在,垃圾汇注器就恒久不会回收掉被援用的对象。 软援用: 一般情况不会回收,如果内存不够要溢出时才会进行回收 弱援用:当垃圾汇注器脱手责任,不管面前内存是否饱和,都会回收掉只被弱援用关联的对象。 虚援用:为一个对象建筑虚援用的独一目的只是为了能在这个对象被回收时收到一个系统的见知。

    恰是因为WeakHashMap使用的是弱援用,「它的对象可能随时被回收」。WeakHashMap 类的举止部分「取决于垃圾回收器的动作」,调用两次size()顺次复返不同值,调用两次isEmpty(),一次复返true,一次复返false都是「可能的」。

    WeakHashMap「责任旨趣」复兴这两点:

    WeakHashMap具有弱援用的特色:随时被回收对象。 发生GC时,WeakHashMap是如何将Entry移除的呢?

    WeakHashMap里面的Entry继承了WeakReference,即弱援用,是以就具有了弱援用的特色,「随时可能被回收」。看下源码哈:

    private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {         V value;         final int hash;         Entry<K,V> next;          /**          * Creates new entry.          */         Entry(Object key, V value,               ReferenceQueue<Object> queue,               int hash, Entry<K,V> next) {             super(key, queue);             this.value = value;             this.hash  = hash;             this.next  = next;         }         ...... 

    「WeakHashMap是如何将Entry移除的?」 GC每次计帐掉一个对象之后,援用对象会放到ReferenceQueue的,接着呢遍历queue进行删除。WeakHashMap的增更正查操作,即是径直/曲折调用expungeStaleEntries()顺次,达到实时断根逾期entry的目的。不错看下expungeStaleEntries源码哈:

    /**    * Expunges stale entries from the table.    */   private void expungeStaleEntries() {       for (Object x; (x = queue.poll()) != null; ) {           synchronized (queue) {               @SuppressWarnings("unchecked")                   Entry<K,V> e = (Entry<K,V>) x;               int i = indexFor(e.hash, table.length);                Entry<K,V> prev = table[i];               Entry<K,V> p = prev;               while (p != null) {                   Entry<K,V> next = p.next;                   if (p == e) {                       if (prev == e)                           table[i] = next;                       else                           prev.next = next;                       // Must not null out e.next;                       // stale entries may be in use by a HashIterator                       e.value = null; // Help GC                       size--;                       break;                   }                   prev = p;                   p = next;               }           }       }   } 

    7. 是否了解Java语法糖嘛?说下12种Java中常用的语法糖?

    语法糖(Syntactic Sugar),也称糖衣语法,让体式愈加爽直,有更高的可读性。Java 中最常用的语法糖主要有泛型、变长参数、条款编译、自动拆装箱、里面类等12种。

    语法糖一、switch 复古 String 与罗列 语法糖二、 泛型 语法糖三、 自动装箱与拆箱 语法糖四 、 顺次变长参数 语法糖五 、 罗列 语法糖六 、 里面类 语法糖七 、条款编译 语法糖八 、 断言 语法糖九 、 数值字面量 语法糖十 、 for-each 语法糖十一 、 try-with-resource 语法糖十二、Lambda抒发式

    8. 什么是指针碰撞?什么是餍足列表?什么是TLAB?

    一般情况下,JVM的对象都放在堆内存中(发生逃遁分析之外)。当类加载检查通事后,Java假造机脱手为重生对象分派内存。如果Java堆中内存是实足规整的,扫数被使用过的的内存都被放到一边,餍足的内存放到另外一边,中间放着一个指针当作分界点的劝诱器,所分派内存只是是把阿谁指针向餍足空间主义搬动一段与对象大小卓著的实例,这种分派式样即是“「指针碰撞」”。

    如果Java堆内存中的内存并不是规整的,已被使用的内存和餍足的内存相互交错在通盘,不不错进行指针碰撞啦,假造机必须爱戴一个列表,纪录哪些内存是可用的,在分派的时候从列表找到一块大的空间分派给对象实例,并更新列表上的纪录,这种分派式样即是“「餍足列表」”

    ?对象创建在假造机中曲直往往常的举止,可能存在线性安全问题。如果一个线程正在给A对象分派内存,指针还莫得来的及修改,同期另一个为B对象分派内存的线程,仍援用这之前的指针指向,这就出「问题」了。

    不错把内存分派的动作按照线程分歧在不同的空间之中进行,每个线程在Java堆中事前分派一小块内存,这即是「TLAB(Thread Local Allocation Buffer,腹地线程分派缓存)」 。假造机通过-XX:UseTLAB设定它的。

    9.CMS垃圾回收器的责任历程,CMS汇注器和G1汇注器的区别。

    CMS(Concurrent Mark Sweep) 汇注器:是一种以赢得最短回收停顿时候为缠绵的汇注器,标记断根算法,运作历程:「开动标记,并发标记,再行标记,并发断根」,收集会束会产生多数空间碎屑。如图(下图开首互联网):

    「CMS汇注器和G1汇注器的区别:」

    CMS汇注器是老年代的汇注器,不错互助重生代的Serial和ParNew汇注器通盘使用; G1汇注器汇注范围是老年代和重生代,不需要集结其他汇注器使用; CMS汇注器以最小的停顿时候为缠绵的汇注器; G1汇注器可展望垃圾回收的停顿时候 CMS汇注器是使用“标记-断根”算法进行的垃圾回收,容易产生内存碎屑 G1汇注器使用的是“标记-整理”算法,进行了空间整合,缩短了内存空间碎屑。

    10.JVM 调优

    JVM调优其实即是通过支持JVM参数,即对垃圾汇注器和内存分派的调优,以达到更高的隐隐和性能。JVM调优主要支持以下参数

    「堆栈内存干系」

    -Xms 建筑开动堆的大小 -Xmx 建筑最大堆的大小 -Xmn 建筑年青代大小,相配于同期成立-XX:NewSize和-XX:MaxNewSize为通常的值 -Xss 每个线程的堆栈大小 -XX:NewSize 建筑年青代大小(for 1.3/1.4) -XX:MaxNewSize 年青代最大值(for 1.3/1.4) -XX:NewRatio 年青代与大哥代的比值(畏俱长久代) -XX:SurvivorRatio Eden区与Survivor区的的比值 -XX:PretenureSizeThreshold 当创建的对象进步指定大小时,径直把对象分派在老年代。 -XX:MaxTenuringThreshold设定对象在Survivor复制的最大年纪阈值,进步阈值转化到老年代

    「垃圾汇注器干系」

    -XX:+UseParallelGC:选拔垃圾汇注器为并行汇注器。 -XX:ParallelGCThreads=20:成立并行汇注器的线程数 -XX:+UseConcMarkSweepGC:建筑大哥代为并发汇注。 -XX:CMSFullGCsBeforeCompaction=5 由于并发汇注器分歧内存空间进行压缩、整理,是以运行一段时候以后会产生“碎屑”,使得运行着力缩短。此值建筑运行5次GC以后对内存空间进行压缩、整理。 -XX:+UseCMSCompactAtFullCollection:绽开对大哥代的压缩。可能会影响性能,可是不错放手碎屑

    「援助信息干系」

    -XX:+PrintGCDetails 打印GC详备信息 -XX:+HeapDumpOnOutOfMemoryError让JVM在发生内存溢出的时候自动生成内存快照,排查问题用 -XX:+DisableExplicitGC回绝系统System.gc(),防患手动误触发FGC形成问题. -XX:+PrintTLAB 稽察TLAB空间的使用情况

    参考与感谢

    [JVM的逃遁分析] (https://segmentfault.com/a/1190000023475016) [口试官 | JVM 为什么使用元空间替换了永久代?] (https://my.oschina.net/u/3471412/blog/4426430) [Metaspace 之一:Metaspace全体先容(永久代被替换原因、元空间特色、元空间内存稽察分析顺次)] (https://www.cnblogs.com/duanxz/p/3520829.html) [深远理会WeakHashmap] (https://blog.51cto.com/mikewang/880775) [一文搞懂WeakHashMap责任旨趣] (https://baijiahao.baidu.com/s?id=1666368292461068600&wfr=spider&for=pc) [谈谈什么是防守线程及作用] (https://www.cnblogs.com/quanxiaoha/p/10731361.html) [浅析java中的TLAB] (https://www.jianshu.com/p/8be816cbb5ed) 《深远理会Java假造机》

    本文转载自微信公众号「捡田螺的小男孩」,不错通过以下二维码眷注。转载本文请持续捡田螺的小男孩公众号。