首页 > 代码库 > JVM及反射
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,
java com.it18zhang.java24.jvm.TestJVM
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及反射
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。