zoukankan      html  css  js  c++  java
  • JVM及反射

    VM

    java virtual machine.
    sandbox
    

    本地方法栈

    程序计数器

    栈区:push/pop

    堆区:为线程共享,内放对象和数组,

    方法区:为线程共享

    线程:是进程内并发执行的代码段, 一个线程就是一栈,栈内压入的方法帧

    绿色的共享的

    dll(windows)

    dynamic link library,动态链接库
    函数库 + 资源.
    

    so(linux)

    shared object,共享对象
    

    *.java ---> *.class --> ClassLoader

    //类类,类的描述符 Class clazz = Person.class ;

    new Person();

    OOM

    Outof memory,内存溢出.
    

    www.StackOverflow.com //解决问题的网址,多去浏览

    Runtime data area

    1.Method area
        方法区.
        存放类描述符.
        Class只需加载一次。
        扩容.
        maven
        共享。
        Class.forName("");
    
    2.heap
        堆区.
        存放对象和数组的地方。
        在所有线程间共享
    
    3.java stack
        每个线程对应一个栈。
        每个进程至少有个一个线程(主线程).
        method frame(stack frame).
    
    
    4.native method stack
        native方法。
    5.program conter register
        略.
    

    java内存由堆和非堆合成

    java堆

    heap    :   存放对象和数组
    1、(yong generation):年轻代
            eden:伊甸区:对象创建所在,垃圾回收先去该区回收;
            survivor-1(幸存1区):同一时刻和幸存2区只有一个是空的
            survivor-2(幸存2区):
    2、(old generation):年老代
    
    non-heap:   非堆 (metaspace+code cache+compressed class space),方法区属于该部分
    off-heap:   离堆:jvm之外的内存(unsafe)

    可通过jvisualvm来查看这些分区

    通过jdk自带jvisualvm软件考察

    1.cmd>jvisualvm
    2.安装visualgc的插件
        工具菜单 --> 插件 -> visual gc ->安装.
    

    jconsole

    jmap

    1.查看堆信息
        jmap -heap 19524
    2.查看永久区
        jmap -permstat 19524
    3.查看类加载信息
        jmap -clstats 19524
    

    JVM调优

    -Xms            //堆初始值  1/64( < 1G)
    -Xmx            //堆最大值  1/4 ( < 1G)
    -Xmn            //年轻代(eden + s0 + s1),-Xmn150M
    
    -XX:NewSize     //for 1.3/1.4/1.8,设置年轻带大小
                    //-XX:NewSize=150m
                    //优先级 > NewRatio.
    
    -XX:MaxNewSize  //for 1.3/1.4/1.8,设置年轻带大小最大值
    
    -XX:PermSize    //设置永久代值,1.8移除了该属性
                    //-XX:PermSize=150m
    -XX:MaxPermSize //设置永久代值最大值
                    //-XX:MaxPermSize=150m
    
    -XX:MetaspaceSize=2048m
    -XX:MaxMetaspaceSize=2048m
    -XX:CompressedClassSpaceSize=2048m      //***** 设置1.8的meta区 *****
    
    -Xss            //栈空间
    -XX:NewRatio    //年轻代和年老代的比例,-XX:NewRation=n,
                    //代表 年轻代 : 年老代 = 1 : n
                    //-XX:NewRatio=2
                    //-XX:NewRatio=0.5,错误的,不能指定小数。
    
    -XX:SurvivorRatio   //设置,单个幸存区 : 伊甸区 = 1 : n 
                        //-XX:SurvivorRatio=2,

    堆设置

    -Xms :初始堆大小

    -Xmx :最大堆大小

    -XX:NewSize=n :设置年轻代大小

    -XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4

    -XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5

    -XX:MaxPermSize=n :设置持久代大小

    收集器设置

    -XX:+UseSerialGC :设置串行收集器

    -XX:+UseParallelGC :设置并行收集器

    -XX:+UseParalledlOldGC :设置并行年老代收集器

    -XX:+UseConcMarkSweepGC :设置并发收集器

    垃圾回收统计信息

    -XX:+PrintGC

    -XX:+PrintGCDetails

    -XX:+PrintGCTimeStamps

    -Xloggc:filename

    并行收集器设置

    -XX:ParallelGCThreads=n :设置并行收集器收集时使用的CPU数。并行收集线程数。

    -XX:MaxGCPauseMillis=n :设置并行收集最大暂停时间

    -XX:GCTimeRatio=n :设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

    并发收集器设置

    -XX:+CMSIncrementalMode :设置为增量模式。适用于单CPU情况。

    -XX:ParallelGCThreads=n :设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

    old   : 133.5M
    young : 8  + 8 + 50.5 = 66.5M
    
    young : old  = 1 : 2        //
    
    eden : survivor = 3 : 1     //
    

    ClassLoader加载

    1.转换类名到location,定位class文件。
    2.类加载方法:通过-cp拿到路径,通过解析出的类映射到层次结构,找到字节码文件,加载进去
    3.
    

    Map :

    x instanceof Person ;           //模糊判断.
    getClass() == Person.class ;    //精准判断
    

    反射

    动态访问对象的属性和方法。
    
    
    Person p = new Person();
    p.setName("xxx");
    p.getName();
    
    1.Class
        类的描述符.
        描述类的特征。
        Person.class ;
        Class clazz = Class.forName();
        Class clazz = Xxx.class()
        Class clazz = obj.getClass();
        //通过Class动态创建对象
        Class clazz=Class.forName("xxxx");
        Object obj=clazz.new Instance();
    
    
    2.Method
        方法.
        方法描述符。
        //得到类中声明的方法(private + public + protected)
        Method m = clazz.getDeclaredMethod("name",String.class);
    
        //得到所可用的方法(继承的方法)·
        Method m = clazz.getMethod("name",...);
    
        //把私有方法定义为可用
        m.setAccessible(true);
    
    3.Field
        字段。
        字段描述符.
        Field f = clazz.getField("name");
        Field f = clazz.getDeclaredField("name");
    
        f.setAccessible();
    
    4.Constructor
        构造函数描述符.
        clazz.getConstructor(Class...)
  • 相关阅读:
    iOS关于本地推送
    [转]iOS8 自动调整UITableView和UICollectionView布局
    [转]在Storyboard中使用自定义的segue类型
    iOS 判断来电状态CTCallCenter代码块不执行问题的解决
    centos 用docker搭建elasticsearch 集群
    element-ui 使用upload上传文件并解决跨域问题
    mysql 常见关键字大全和引擎的差异
    Guava---文件操作Files
    springboot这个redies 查看内存信息
    人生也要动态规划
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6783387.html
Copyright © 2011-2022 走看看