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及反射的主要内容,如果未能解决你的问题,请参考以下文章