JVM

JVM

jvm.png
  • 程序计数器

​ 线程私有,主要用于线程切换能恢复到正确的执行位置。执行java方法时这个计数器为当前字节码的位置,如果是native方法的时候为空。

  • java虚拟机栈

​ 线程私有,每个方法执行的时候创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

​ 局部变量表存放了编译期可知的各种基本数据类型,对象引用和returnAddress类型。局部变量表所需的内存空间在编译期间完成分配,在方法运行期间不会改变局部变量表的大小。

  • 本地方法栈

​ 和虚拟机栈类似

  • java堆

​ 线程共享。所有对象实例和数组都在堆上分配,垃圾收集器的主要区域。

  • 方法区

​ 线程共享。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码。

  • 运行时常量池

​ 方法区的一部分。存放编译期生成的各种字面量和符号引用。

GC

判断对象存活算法

  • 引用计数算法

​ 给对象添加一个引用计数器,有地方引用的时候,计数器值加1,引用失效的时候,计数器减1。计数器为0的对象不可能被使用。

  • 可达性分析算法

​ 通过gc root为起点向下搜索,搜索经过的路径成为引用链,当一个对象到引用链没有相连时,证明此对象不可用。

GC算法

  • 标记清除算法

​ 标记出要收集的对象,标记完成后统一清除。问题是效率低,而且会产生大量内存碎片。

  • 复制算法

​ 将内存分为两块,每次只使用一块,当内存用完了,将存活的对象复制到另一块内存上,将使用过的内存一次清理掉。

  • 标记整理算法

​ 标记出要收集的对象,标记完成后让所有存活的对象都向一端移动,直接清理掉端边界的内存。

垃圾收集器

gc.png
  • Serial收集器

​ 单线程收集器,进行垃圾收集时,暂停其他线程。

  • ParNew收集器

​ Serial收集器的多线程版本,

  • Parallel Scavenge

​ 使用复制算法的收集器,并行。目标是达到一个可控制的吞吐量。

  • Serial Old收集器

​ Serial收集器的老年代版本

  • Parallel Old收集器

​ Parallel Scavenge收集器的老年代版本

  • CMS收集器

​ 以获取最短回收停顿时间为目标的收集器。

  • G1收集器

​ 并行与并发:充分利用多CPU、多核环境下的硬件优势,使用多个CPU(CPU或者
CPU核心)来缩短Stop-The-World停顿的时间;

​ 空间整合:整体基于标记-整理算法,局部使用复制算法,减少内存碎片。

​ 可预测的停顿。

JVM参数

堆设置

-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数.并行收集线程数.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.一些概念 1.1.数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始...
    落落落落大大方方阅读 10,179评论 4 86
  • Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系...
    尹小凯阅读 5,623评论 0 10
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,944评论 3 83
  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 11,230评论 2 31
  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 5,401评论 1 0

友情链接更多精彩内容