JVM
文章平均质量分 81
java JVM 学习笔记
die_job
这个作者很懒,什么都没留下…
展开
-
Java虚拟机常用调优参数
文章目录一、堆内存设置相关参数1、-Xms2、-Xmx3、-Xmn4、-XX:SurvivorRatio5、-XX:PretenureSizeThreshold6、-XX:MaxTenuringThreshold 一、堆内存设置相关参数 1、-Xms -Xms参数用于设置堆内存的最小值,如-Xms20M,设置堆内存的最小值为20M 2、-Xmx -Xmx参数用于设置堆内存的最大值,如-Xmx20M,设置堆内存的最大值为20M 3、-Xmn -Xmn参数用于设置堆中新生代区域的大小,如-Xmn10M,设置新生原创 2021-06-30 22:50:31 · 1257 阅读 · 0 评论 -
HotSpot中对象存活判定算法实现细节
文章目录1、根节点枚举2、安全点3、安全区域4、记忆集和卡表5、写屏障6、并发的可达性分析 1、根节点枚举 在JVM中固定可作为GC Roots的节点主要为全局性的引用,例如常量或类静态属性与栈帧中的本地变量表。迄今为止,所有收集器在根节点枚举这一步骤时都是必须暂停用户线程的。HotSpot使用一组称为OopMap的数据结构来直接得到哪些地方存放着对象引用,一旦类加载完成,HotSpot就会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,也会在特定的位置记录下栈里和寄存器里哪些位置是引用。原创 2021-06-27 22:24:50 · 227 阅读 · 0 评论 -
JVM内存分配与回收策略
文章目录1、对象优先在Eden中分配2、大对象直接进入老年代3、长期存活的对象将进入老年代4、动态对象年龄判定5、空间分配担保 1、对象优先在Eden中分配 在经典分代理论的设计下,新对象通常会分配在新生代中,少数情况下(例如对象大小超过一定阈值)也可能会直接分配在老年代。大多数情况下,对象在新生代的Eden中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。垃圾收集期间仍存活的对象无法全部放入Survivor区时,通常会通过分配担保机制转移到老年代中。 2、大对象直接进入老年代原创 2021-06-25 23:22:40 · 76 阅读 · 0 评论 -
经典垃圾收集器概览
文章目录一、新生代收集器1、Serial收集器2、ParNew收集器3、Parallel Scavenge收集器二、老年代收集器1、Serial Old收集器2、Parallel Old收集器3、CMS收集器 一、新生代收集器 1、Serial收集器 工作流程 Serial收集器是最基础、历史最悠久的收集器,它在进行垃圾收集时,必须暂停其他所有工作线程,然后使用一条收集线程去完成收集工作,直到收集结束,其他工作线程再恢复。 优点 Serial收集器的优点是简单高效、额外内存消耗小 缺点 Serial收集器中原创 2021-06-20 23:04:41 · 79 阅读 · 0 评论 -
JVM垃圾收集回收策略
文章目录一、jVM垃圾收集概述二、哪些内存需要回收1、引用计数法2、可达性分析算法3、Java中的引用4、对象并不是标记一次即判为死亡三、垃圾收集算法1、分代收集理论 一、jVM垃圾收集概述 在Java内存运行时区域中,程序计数器、虚拟机栈、本地方法栈随着线程的创建和销毁而被分配和清除,栈中的栈帧随着方法的进入和退出而出栈和入栈,每一个栈帧中分配多少内存基本上是在类结构确定下来时就已经知晓的。因此Java垃圾回收中,主要关注的是堆和方法区这两个区域。 垃圾回收主要需要考虑三个问题: 哪些内存需要回收? 什原创 2021-06-14 22:52:24 · 421 阅读 · 0 评论 -
Java内存溢出基本分析与常用解决方式
文章目录一、Java堆溢出二、虚拟机栈和本地方法栈内存溢出三、方法区和运行时常量池内存溢出四、直接内存溢出 在JVM的堆、方法区、Java虚拟机栈、本地方法栈和程序计数器中,除了程序计数器外,其他几个运行时数据区和直接内存都有引发OutOfMemoryError异常的可能。 一、Java堆溢出 Java堆存储的是程序中的对象实例,因此如果不断的有新实例被创建,并且不被垃圾回收,就迟早会造成内存溢出异常。可以通过虚拟机参数-Xmx设置堆的最大值,-Xms设置堆的最小值。 解决堆溢出的第一步是使用-XX:+He原创 2021-06-10 23:43:34 · 685 阅读 · 0 评论 -
对象在堆中的创建、布局和访问
文章目录一、对象的创建二、对象的内存布局三、对象的访问定位 一、对象的创建 在Java语言中,通常使用new关键字进行对象的创建。当Java虚拟机遇到一条字节码new指令时,会首先检查该类是否已被加载、解析和初始化过,如果没有,就会先执行相应的类加载过程。 随后即为对象分配内存,对象所需内存的大小在类加载完成后已确定,虚拟机会在堆中划分出对应大小的内存空间。划分内存有指针碰撞和空闲列表两种方式: 指针碰撞通常在Java堆中的内存是完全规整的设计中使用,所有被使用过的内存在一边,而未被使用的内存在另一边,中原创 2021-06-09 23:37:43 · 281 阅读 · 0 评论 -
JVM内存模型
目录JVM运行时数据区一、线程共享的部分1、Java堆2、方法区二、线程私有的部分1、程序计数器2、Java虚拟机栈3、本地方法栈 JVM运行时数据区 在Java程序运行的时候,Java虚拟机会把它管理的内存划分为多个不同的数据分区,每个分区有各自的用途、以及各自的创建和销毁时间。这些运行时划分的分区总体上可分为线程共享的部分和线程私有的部分。 一、线程共享的部分 1、Java堆 Java堆在虚拟机启动时创建,是虚拟机所管理的内存中最大的一块分区,用于存放对象实例,Java程序中几乎所有的对象实例都在堆中分原创 2021-06-09 00:14:35 · 174 阅读 · 0 评论