Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackoverflowError 异常。Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个 OutOfMemoryError 异常。Native方法服务JVM执行Java程序时自动分配的Java堆是垃圾收集管理器管理的内存区域Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的java堆的大小是可扩展的, 通过-Xmx和-Xms控制。–Xms(堆的初始容量)、-Xmx(堆的最大容量) 来指定。Edem : from : to = 8 : 1 : 1java堆是GC垃圾回收的主要区域。 GC分为两种: Minor GC、Full GCMinor GC是发生在新生代中的垃圾收集动作, 所采用的是复制算法。Eden出生后,经过一次MinorGc后,如果对象还存活,并且能够被To区域所容纳。Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 ,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。JVM常量池主要分为Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池。java class文件常量池中的符号信息class文件中描述的符号引用,在类的解析阶段还会将这些符号引用翻译出直接引用(直接指向实例对象的指针,内存地址),翻译出来的直接引用也是存储在运行时常量池中。Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致 OutOfMemoryError 异常出现| 参数 | 含义 | 默认值 | 说明 | 
|---|---|---|---|
| -Xms | 初始堆大小 | 物理内存的 1/64 | |
| -Xmx | 最大堆大小 | 物理内存的 1/4 | |
| -Xss | 每个线程栈的大小 | 在相同物理内存下,减小这个值能生成更多的线程,操作系统对一个进程内线程数有限制,等同于 -XX:ThreadStackSize | |
| -Xmn | 新生代大小 | 与 -XX:NewSize设置新生代大小和-XX:MaxNewSize新生代最大值含义一致,推荐使用-Xmn`` | |
| -XX:MaxMetaspaceSize | 设置元空间最大值 | 默认值是-1 | JDK1.8之前是永久代的概念,参数是 -XX:MaxPermSize, | 
| -XX:MetaspaceSize | 设置元空间初始值 | 默认值是21M | JDK1.8之前是永久代的概念,参数是-XX:PermSize | 
| -XX:MaxDirectMemorySize | 最大直接内存大小 | -1 | JDK1.8开始支持的参数 | 
| -XX:NewRatio | 老年代与新生代的比值 | 默认值2 | 新生代(包括 Eden和两个Survivor区) | 
| -XX:SurvivorRatio | Eden区与Survivor区的大小比值 | 默认值8 | 设置为8,则两个 Survivor区与一个Eden区的比值为2:8 | 
| -XX:PretenureSizeThreshold | 对象超过多大是直接在老年代分配 | 默认值0(先在新生代创建) | 新生代采用 Parallel Scavenge GC时无效 | 
| -XX:MaxTenuringThreshold | 垃圾最大年龄 | 默认值15 | 如果设置为 0的话,则年轻代对象不经过Survivor区,直接进入年老代 | 
| -XX:PrintCommandLineFlags | 启动的时候打印 JVM参数 | 默认关闭 | |
| -XX:-UseBiasedLocking | 不启动偏向锁 | 默认启用 | JDK1.6开始支持偏向锁,默认启用 | 
| -XX:+AggressiveOpts | 启动性能优化参数 | 默认关闭 | 优化功能参数是属于实验性功能,预计将在即将发布的版本中成为默认功能 | 
| -XX:+DisableExplicitGC | 关闭 System.gc() | 默认启动 | |
| -Xnoclassgc | 禁用类垃圾回收 | 默认关闭 | |
| -XX:ParallelGCThreads | 并行收集器的线程数 | 此值最好配置与处理器数目相等 | |
| -XX:+UseAdaptiveSizePolicy | 自动选择年轻代区大小和相应的 Survivor区比例 | UseParallelGC垃圾收集器默认启动了AdaptiveSizePolicy | |
| -XX:MaxGCPauseMillis | 垃圾回收的最长时间(最大暂停时间 ms) | 软目标, JVM尽力调整配置达到 | |
| -XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | 公式为 1/(1+n) | 
new指令时,先去检查指令的参数是否能在常量池中定位到一个类的符号引用。java 栈中存储的refrence 指向的就是句柄池的地址,句柄池里存放的是java 对象实例的地址,和java类型数据的具体信息。refrence 里存储的是堆中java 具体实例对象的地址,而堆中java 具体的实例对象自关联到方法区中的类型数据具体信息。1,引用失效后减1,任何时刻计数器为0的对象就是不能在被使用的null,JVM在合适的时间就会回收该对象JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。在java中,用java.lang.ref.WeakReference类Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型Class对象确保Class文件的字节流中包含的信息符合虚拟机规范的约束要求,保证代码运行时不会危害虚拟机自身
文件格式验证
字节码验证
元数据验证
符号引用验证
Java虚拟机将常量池内的符号引用替代为直接引用的过程Java 程序代码才真正开始执行。在这个阶段,JVM 会根据语句执行顺序对类对象进行初始化。new、getstatic、putstatic、invokestatic 这 4 条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。java.lang.reflect 包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化main() 方法的那个类),虚拟机会先初始化这个主类。JVM 完成初始化阶段之后,JVM 便开始从入口方法开始执行用户的程序代码。JVM 便开始销毁创建的 Class 对象,最后负责运行的 JVM 也退出内存。如果一个类加载器收到加载类的请求,它首先不回自己去尝试加载某个类,而是把这个请求委派给父类加载器去完成,每一层次的类加载器都是如此,只有当父加载器无法完成加载时子加载器才会尝试自己完成加载。
 
启动类加载器:负责加载JavaHome\lib目录
扩展加载器:负责加载JavaHome\lib\ext目录,负责加载扩展类
应用程序加载器:负责加载用户类路径上所有的类库,一般情况下这个就是程序中默认的类加载器
 尝试加载某个类,而是把这个请求委派给父类加载器去完成,每一层次的类加载器都是如此,只有当父加载器无法完成加载时子加载器才会尝试自己完成加载。
                    上一篇:QML 布局详解