JVM及反射

Posted 艺海浮台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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...)

以上是关于JVM及反射的主要内容,如果未能解决你的问题,请参考以下文章

Golang实践录:反射reflect的一些研究及代码汇总

反射的用途及实现

java 反射代码片段

Java反射在JVM的实现

Java反射在JVM的实现

Java反射在JVM的实现