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 GC
Minor GC
是发生在新生代中的垃圾收集动作, 所采用的是复制算法。Eden
出生后,经过一次MinorGc
后,如果对象还存活,并且能够被To
区域所容纳。Survivor
区域 ( 即 to
区域 ) 中,然后清理所使用过的 Eden
以及 Survivor
区域 ( 即 from
区域 ),并且将这些对象的年龄设置为1
Survivor
区每熬过一次 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 布局详解