
深入理解Java虚拟机
Jvm数据结构,调优命令,GC等
高国藩
这个作者很懒,什么都没留下…
展开
-
为什么说SPI打破双亲委派机制
为什么说SPI打破双亲委派机制 简单介绍ClassLoader的双亲委派机制: java类通过Classloader加载,Classloader之间有继承关系,AppClassLoader继承ExtClassloader继承BootstrapClassloader。在类加载时,子加载器会调用父加载器来加载类,如果父加载器不能加载类,才会交给子加载器来加载;如果子加载器也加载失败,那么就报异常。 可以看出双亲委派机制是一种至下而上的加载方式,那么SPI是如何打破这种关系? 以JDBC加载驱动为例: 在JDBC原创 2020-06-05 16:03:19 · 887 阅读 · 0 评论 -
UnSafe 源码解毒
java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1、通过Unsafe类可以分配内存,可以释放内存; 类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。 2、可以定位对象某字段的内存位置,也可以修改对象的...原创 2018-10-24 15:32:16 · 742 阅读 · 0 评论 -
ReentrantLock 源码解毒
一、前言 在分析了AbstractQueuedSynchronier源码后,接着分析ReentrantLock源码,其实在AbstractQueuedSynchronizer的分析中,已经提到过ReentrantLock,ReentrantLock表示下面具体分析ReentrantLock源码。 二、ReentrantLock数据结构 ReentrantLock的底层是借助Abstr...原创 2018-10-24 15:27:59 · 238 阅读 · 0 评论 -
AbstractQueuedSynchronizer 源码解毒
前言 队列同步器 AbstractQueuedSynchronizer(以下简称 AQS),是用来构建锁或者其他同步组件的基础框架。它使用一个 int 成员变量来表示同步状态,通过 CAS 操作对同步状态进行修改,确保状态的改变是安全的。通过内置的 FIFO (First In First Out)队列来完成资源获取线程的排队工作。更多关于 Java 多线程的文章可以转到 这里 AQS 和...原创 2018-10-24 15:23:55 · 242 阅读 · 0 评论 -
Java 锁与对象头
一:对象头 HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,这部分数...原创 2018-12-28 13:27:34 · 746 阅读 · 0 评论 -
JVM 对象分配
下面我们再来看下JVM的一些内存分配与回收策略: (A) 对象分配规则 1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC。 2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象)。这样做的目的是避免在Eden区和两个Survivor区之间发生大量的内存拷贝。通过参数-XX:PretenureSizeThreshold=314...原创 2018-08-20 16:51:04 · 8941 阅读 · 0 评论 -
JVM 垃圾回收器
JVM垃圾收集算法 JVM垃圾收集算法有四种:标记-清除算法、复制算法、标记-整理算法、分代收集算法 标记-清除算法: 该算法如同它的名字一样,分为两个阶段:标记、清除。首先标记出所有需要回收的对象,然后,统一清除这些被标记的对象。该算法的缺点是:1、效率不高;2、产生大量不连续的内存碎片,导致有大量内存剩余的情况下,由于,没有连续的空间来存放...原创 2018-08-20 16:00:24 · 8140 阅读 · 0 评论 -
JVM GC日志分析
一、GC日志的格式分析 在讲述GC日志之前,我们先来运行下面这段代码 package com.example; public class TestMinorGC { private static final int _1MB = 1024*1024; public static void testAllocation() { byte[] allocati...原创 2018-08-20 15:09:49 · 8277 阅读 · 0 评论 -
JVM 命令工具集合
Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况。 这里主要介绍一下jstat、jmap命令以及相关工具。 一、jstat查看 gc实时执行情况 jstat命令命令格式: jstat [Options] vmid [interval] [count] 命令参数说明: Options,一般使用 -gcutil 或 -gc 查看gc 情况 ...原创 2018-08-20 15:05:49 · 7885 阅读 · 0 评论