java virtual machine. sandbox
本地方法栈 java
程序计数器linux
栈区:push/pop web
堆区:为线程共享,内放对象和数组, windows
方法区:为线程共享数组
线程:是进程内并发执行的代码段, 一个线程就是一栈,栈内压入的方法帧并发
绿色的共享的jvm
dynamic link library,动态连接库 函数库 + 资源.
shared object,共享对象
*.java ---> *.class --> ClassLoadermaven
//类类,类的描述符 Class clazz = Person.class ;函数
new Person();工具
Outof memory,内存溢出.
www.StackOverflow.com //解决问题的网址,多去浏览
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内存由堆和非堆合成
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来查看这些分区
1.cmd>jvisualvm 2.安装visualgc的插件 工具菜单 --> 插件 -> visual gc ->安装.
1.查看堆信息 jmap -heap 19524 2.查看永久区 jmap -permstat 19524 3.查看类加载信息 jmap -clstats 19524
-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 //
1.转换类名到location,定位class文件。 2.类加载方法:经过-cp拿到路径,经过解析出的类映射到层次结构,找到字节码文件,加载进去
3.
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...)