2024年5月14日大约 10 分钟
volatile 关键字
volatile
是 Java 中的一个关键字,用于声明变量,表示该变量可能会被多个线程同时访问。使用 volatile 关键字修饰的变量具有以下两个特性:
- 可见性(Visibility): 当一个线程修改了 volatile 变量的值,该变量的新值会立即被其他线程看到。换句话说,对一个 volatile 变量的写操作对其他线程是可见的。
- 禁止指令重排序(Preventing Reordering): volatile 变量的读写操作会被禁止指令重排序优化,保证了变量操作的顺序性。
2022年6月21日大约 2 分钟
Java对象如果是数组类型,则虚拟机用3个字宽存储对象头;若是非数组类型,则用2个字宽存储对象头。在32位虚拟机中,1字宽等于4字节32bit;64位虚拟机中1字宽等于8字节64bit
Java对象头存储内容
长度 | 内容 | 说明 |
---|---|---|
32/64bit | Mark Word | 存储对象的HashCode、分代年龄和锁信息等 |
32/64bit | Class Meta Address | 存储指向对象类型数据的指针 |
32/64bit | Array Length | 数组的长度(仅仅对象是数组类型) |
2022年6月21日大约 2 分钟
锁 | 优点 | 缺点 | 试用场景 |
---|---|---|---|
重入锁 | 提供了更多的功能和灵活性,例如支持可中断等待、超时等待、条件等, 允许一个线程多次获取锁 | 需要手动释放锁,可能出现忘记释放锁的情况 | 需要更多功能和灵活性的场景,例如需要支持可中断等待、超时等待、条件等待等情况等 |
读写锁 | 将读操作和写操作分离,读操作可以并发执行,提高了并发性能,写操作是独占的,保证了数据的一致性 | 写操作可能会被读操作阻塞,导致写操作的响应时间变长 | 读操作频繁,写操作相对较少的场景,可以提高并发性能 |
偏向锁 | 加锁和解锁不需要额外开销 | 如果线程间存在锁竞争,会带来额外的锁消耗 | 适用于只有一个线程访问同步块场景 |
轻量级锁 | 竞争的线程不会阻塞,提高程序响应速度 | 如果始终得不到锁竞争线程,使用自旋会消耗CPU | 追求响应时间,同步块执行速度非常快 |
重量级锁 | 线程竞争不使用自旋,不会消耗CPU | 线程阻塞,响应时间缓慢 | 追求吞吐量,同步块执行速度较长 |
2022年6月21日大约 1 分钟
数据持久化MYSQL的sql
CREATE TABLE IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`remote_service_name` VARCHAR(255),
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query',
PRIMARY KEY (`trace_id_high`, `trace_id`, `id`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`remote_service_name`) COMMENT 'for getTraces and getRemoteServiceNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address',
`endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies (
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT,
`error_count` BIGINT,
PRIMARY KEY (`day`, `parent`, `child`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci;
2022年4月22日大约 2 分钟
Jstat
jstat
是 JDK 中的一个工具,用于监视 Java 虚拟机 (JVM) 的各种统计信息,比如堆内存、类加载、垃圾回收等。它可以提供实时的监控数据,帮助开发人员分析和调优 Java 应用程序的性能。
使用 jstat 工具需要指定 Java 虚拟机的进程 ID (PID)。下面是 jstat 命令的基本语法:
jstat [ options ] pid [ interval [ count ]]
2020年9月7日大约 2 分钟
方案一:Spring Boot Admin
Spring Boot Admin是一个开源社区项目,用于管理和监控SpringBoot应用程序,依赖spring boot actuator。可通过注册中心与admin-client两种方式使用。
优点:
- 比较美观的可视化界面,能够监控CPU、线程、内存、性能、类、JVM线程、缓存、配置属性、依赖关系等使用情况。
- 容易集成,仅需启动一个spring boot admin 工程加入到注册中心即可(支持consul,eureka,zookeeper等注册中心)。
2020年1月10日大约 6 分钟
Pinpoint
官网地址: https://pinpoint-apm.gitbook.io/pinpoint
Pinpoint 是一个APM(Application performance management)工具,相对于其他APM工具(例如ZipKin)有一个强大的优势,那就是应用程序无需修改一行代码就能直接使用,例如Java程序直接使用Pinpoint提供的Java agent(jar包)就能使用。目前Pinpoint直接Java/PHP/Python三种语言,未来可能会支持更多语言,开源社区极其活跃,版本迭代比较快。
2019年12月30日大约 1 分钟