JVM及反射

VM

java virtual machine.
sandbox

本地方法栈 java

程序计数器linux

栈区:push/pop web

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

方法区:为线程共享数组

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

绿色的共享的jvm

dll(windows)

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

so(linux)

shared object,共享对象

*.java ---> *.class --> ClassLoadermaven

//类类,类的描述符 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 : 存放对象和数组 一、(yong generation):年轻代 eden:伊甸区:对象建立所在,垃圾回收先去该区回收; survivor-1(幸存1区):同一时刻和幸存2区只有一个是空的 survivor-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...)
相关文章
相关标签/搜索