![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机
文章平均质量分 83
以Hotspot为主,对JVM的内存区域、对象、垃圾回收算法、class文件结构、类加载进行深入分析和介绍,并对基础调优工具jmap、jstack、arthas、MAT等进行介绍和使用
每天只学一点点
If you are good at something, never do it for free。
展开
-
JDK8直接内存默认大小
文章目录直接内存大小代码验证源码验证直接内存大小直接内存(DirectMemory)的容量大小可通过-XX:MaxDirectMemorySize参数来指定,如果不去指定,则默认与Java堆最大值(由-Xmx指定)一致。上述是《深入理解Java虚拟机》原文。实际上直接内存的默认值大小为 Eden+(From+To)/2+Old通过设置-Xmx 设置最大堆,设置-XX:NewSize指定初始化新生代大小,-XX:SurvivorRatio=8将新生代分隔获取固定的Eden和survivor1 和原创 2021-06-17 16:35:22 · 3661 阅读 · 0 评论 -
直接内存默认大小到底有多大?
文章目录Java源码JVM源码Java源码在Java源码中有关于直接内存的定义public class VM { // A user-settable upper limit on the maximum amount of allocatable direct // buffer memory. This value may be changed during VM initialization if // "java" is launched with "-XX:MaxD原创 2021-06-17 16:29:47 · 742 阅读 · 0 评论 -
JDK性能监控工具
文章目录jps-查看Java进程jstat-查看虚拟机运行时信息jinfo-查看虚拟机参数jmap-导出堆到文件jhat-jdk自带的堆分析工具jps-查看Java进程 Jps命令作用是列出系统中所有的Java应用程序。通过Jps命令可以方便的查看Java进程的启动类、传入参数和Java虚拟机参数等。 Jps命令参数:参数 -q :指定jps只输入进程id参数 -m:用于输出传递给Java进程(主函数)的参数参数 - l :输出主函数的完整路径参数 - v:可以显示传递给Java虚拟机的原创 2021-06-16 15:51:29 · 366 阅读 · 0 评论 -
类的初始化和类加载
文章目录类的生命周期类的初始化类加载的过程加载验证文件格式验证元数据验证字节码验证符号引用验证准备解析初始化src\hotspot\share\classfile\classFileParser.cpp类的生命周期类加载机制:Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、原创 2021-05-18 14:48:31 · 626 阅读 · 1 评论 -
内存分配和回收策略
文章目录对象的分配1.对象优先在Eden分配2.大对象直接进入老年代长期存活的对象将进入老年代动态年龄判断空间分配担保对象的分配1.对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次MinorGC。2.大对象直接进入老年代 大对象就是指需要大量连续内存空间的Java对象,最典型的大对象便是那种很长的字符串,或者元素数量很庞大的数组。 大对象对虚拟机的内存分配来说就是一个不折不扣的坏消息,比遇到一个大对象更加坏的消息就是原创 2021-05-15 16:35:40 · 99 阅读 · 0 评论 -
并发标记和跨代引用
文章目录并发标记三色标记多标漏标CMS解决方案G1的解决方案跨代引用记忆集卡表并发标记 在Mark-And-Sweep(标记清除算法)中,会设置标志位来记录对象是否引用。最开始会吧所有的标志位都设置成0,如果通过可达性分析发现这个对象可达,就会设置成1,等标记完成之后,将为标记的对象清除,恢复标志位为0,方便下次清理。 这个算法为了保证在标记过程中发生引用的变化,需要暂停所有的用户线程,保证不会出现漏标的问题。但是这样的话会造成长时间的挂起,对于实时性要求高的系统,这种长时间挂起是让人无法接受的。原创 2021-05-15 16:11:33 · 271 阅读 · 0 评论 -
04_常见垃圾回收器
文章目录常见垃圾回收器Serial/SerialOldParNewParallelScavenge(ParallerGC)/ParallelOld参数ConcurrentMarkSweepGarbage First常见垃圾回收器Serial/SerialOld 最早出现、单线程、适合单CPU的垃圾收集器。 它只会使用一个处理器或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。 它依然是HotSpot虚拟机运行在客户端模式下的默认新生代收原创 2021-05-15 12:49:00 · 151 阅读 · 0 评论 -
03_对象存活及垃圾回收算法
文章目录1. 判断对象是否存活引用计数算法可达性分析GC Rootsfinalize2. 回收方法区Class回收参数1. 判断对象是否存活 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。引用计数算法在对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1,当引用失效时,计数器减1.引用计数算法存在一个问题:两个垃圾对象互相引用的时候,实际是需要垃圾原创 2021-05-14 12:31:59 · 104 阅读 · 2 评论 -
Java中的四种引用
强引用 强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Objectobj=newObject()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象。软引用 软引用是用来描述一些还有用,但非必须的对象。只被软引用关联着的对象,在系统将要发生内存溢出异常前,会把这些对象列进回收范围之中进行第二次回收,如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK1.2版之后提供了SoftReference类来实现软引用。/**原创 2021-05-13 17:30:59 · 75 阅读 · 0 评论 -
02_JVM中的对象及引用
文章目录1. JVM中的对象及引用1.1 Java对象的创建1.1.1 对象的内存分配1)类型检查2)分配内存指针碰撞空闲列表并发安全问题CASTLAB3)内存空间初始化4)设置5)对象初始化2.1 对象的内存布局3.1 对象的访问定位句柄直接指针1. JVM中的对象及引用1.1 Java对象的创建1.1.1 对象的内存分配 当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如原创 2021-05-13 12:07:42 · 145 阅读 · 1 评论 -
01_JVM基础及内存区域
JVM及Java内存区域JVM基础知识Java程序运行流程JVM、JRE、JDK的关系Java跨语言及跨平台常见JVM实现Java内存区域运行时数据区程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存这里的概念性解释大多出自于 《深入理解Java虚拟机》2021年5月12日 第一版JVM基础知识Java程序运行流程一个Java程序,首先通过javac命令将Java源文件编译成.class后缀的class文件,通过JVM加载到方法区,执行引擎执行这些代码时,会翻译成操作系统相原创 2021-05-12 18:05:25 · 170 阅读 · 1 评论