java
文章平均质量分 69
phil002
这个作者很懒,什么都没留下…
展开
-
【Java】Java Agent动态追踪技术
动态追踪技术动态追踪技术是一个可以不用重启线上java项目来进行问题排查的技术,也叫Java Agent技术,可以利用它来构建一个附加的代理程序,用来协助检测性能,还可以替换一些现有功能,甚至JDK的一些类我们也能修改,有点像JVM级别的AOP功能。既然作为JVM的AOP,就必须要有AOP的功能,所以Java Agent提供了两个类似于AOP的方法:premain():在main()方法运行之前的进行一些操作。agentmain():可以控制类运行时的行为。但在一个JVM中,只会调用一个。已转载 2021-10-09 11:22:41 · 499 阅读 · 0 评论 -
【JVM】十、CPU负载过高分析
原生分析方式1、使用 top 命令查看线程占用 cup 比率[tomcat@localhost ~]$ topTasks: 189 total, 1 running, 188 sleeping, 0 stopped, 0 zombie%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st%Cpu1 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0原创 2021-10-09 10:47:24 · 449 阅读 · 0 评论 -
【JVM】九、堆外内存泄漏排查
堆外内存泄漏排查直接内存:指的是Java应用程序通过直接方式从操作系统中申请的内存,也叫堆外内存,因为这些对象分配在Java虚拟机的堆(严格来说,应该是JVM的内存外,但是堆是这块内存中最大的)以外。直接内存有哪些?元空间。BIO中ByteBuffer分配的直接内存。使用Java的Unsafe类做一些分配本地内存的操作。JNI或者JNA程序,直接操纵了本地内存,比如一些加密库、压缩解压等。JNI(Java Native Interface):通过使用Java本地接口(C或者C++)书写程序转载 2021-10-08 17:58:48 · 5199 阅读 · 6 评论 -
【JVM】八、OOM异常的模拟
OutOfMemoryError异常在JVM内存区域中,除了程序计数器外,其他内存区域都有可能发生OOM异常,下面我们来一一模拟每个内存区域OOM异常的场景。先介绍几个JVM参数:-Xms:设置JVM初始堆内存的大小。-Xmx:设置JVM最大堆内存的大小。-Xmn: 设置年轻代的大小、-Xss:设置每个线程对应的栈的大小。-XX:+HeapDumpOnOutOfMemoryError:发生OOM异常时生成heap dump文件-XX:HeapDumpPath=path:heap dump文件转载 2021-10-08 17:33:43 · 930 阅读 · 0 评论 -
【Java】Java对比两个JSON对象(深度广度比较)
思路:将对象里面的每个属性转为path:value模式用map装起来,然后根据path比较值,返回不同(这里需要注意的是,如果是集合,必须是有序的且按照规则排好序的)pom.xml<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifac...原创 2021-08-11 11:27:14 · 13870 阅读 · 18 评论 -
【Java】线程如何全局捕获异常
web清空tomcat线程池子线程线程副本此处以过滤器来实现,因为过滤器在doService()外线程异常场景清除值触发点一次性线程异常场景捕获可通过继承UncaughtExceptionHandler实现uncaughtException方法然后通过Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler());全局设置异常执行的类Executor创建的线程池executorservice.execut原创 2021-08-02 23:11:24 · 1184 阅读 · 0 评论 -
【Java】如何使用ThreadLocal传递上下文
场景这里就直接介绍最复杂的应用场景多个独立的线程池嵌套使用,上下文传递及清除ThreadLocal值,此处就简单以ThreadLocal,InheritableThreadLocal,TransmittableThreadLocal(阿里开源组件)为例介绍ThreadLocal该线程副本对象只适用于一次性线程,不适合使用线程池以及父子线程(父子线程值不会传递,线程池中的线程重复使用时候会存在这此线程业务处理使用到了上一次该线程业务处理的值)InheritableThreadLocalInher原创 2021-08-02 16:07:08 · 1563 阅读 · 1 评论 -
【Java】七、网络编程总结
https://www.cnblogs.com/swordfall/p/10781281.html转载 2021-07-26 08:59:22 · 95 阅读 · 0 评论 -
【JVM】五、GC 算法以及应用场景
各种垃圾收集器的实现细节虽然并不相同,但总体而言,垃圾收集器都专注于两件事情:查找所有存活对象抛弃其他的部分,即死对象,不再使用的对象。标记可达对象(Marking Reachable Objects)现代JVM中所有的GC算法,第一步都是找出所有存活的对象。下面的示意图对此做了最好的诠释:首先,有一些特定的对象被指定为 Garbage Collection Roots(GC根元素)。包括:当前正在执行的方法里的局部变量和输入参数活动线程(Active threads)内存中所有类的原创 2021-03-28 16:33:59 · 1047 阅读 · 0 评论 -
【JVM】四、JVM堆内存对象分配及垃圾收集事件
堆内存分配(新生代,存活区,老年代)新生代(Eden,伊甸园)Eden 是内存中的一个区域, 用来分配新创建的对象。通常会有多个线程同时创建多个对象, 所以 Eden 区被划分为多个 线程本地分配缓冲区(Thread Local Allocation Buffer, 简称TLAB)。通过这种缓冲区划分,大部分对象直接由JVM 在对应线程的TLAB中分配, 避免与其他线程的同步操作。如果 TLAB 中没有足够的内存空间, 就会在共享Eden区(shared Eden space)之中分配。如果共享Ede原创 2021-03-28 15:31:11 · 135 阅读 · 0 评论 -
【性能诊断工具&Arthas】如何优雅的使用Arthas-Java诊断工具
官网地址:https://arthas.aliyun.com/en-us/注:此处演示以idea插件进行演示一、idea安装arthas idea插件点击quick start点击IDEA Pluginidea安装arthas idea插件二.、下载arthas-boot.jar并允许,选择指定java实例curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar三、查看运行中的java实例原创 2021-05-03 15:19:09 · 1743 阅读 · 1 评论 -
【Java】Java性能分析常用命令
//查询内存使用前十的进程ps -aux --sort -rss |head -10// 查询java进程启动参数jhsdb jinfo --flags --pid 28575//查询gc以及内存使用情况 jstat -gc 24512//查询容量使用百分比 jstat -gcutil 24512//查询java进程堆配置及使用信息 jhsdb jmap --heap --p...原创 2021-08-11 11:26:06 · 643 阅读 · 0 评论 -
【JVM】六、JDK工具(查看JVM参数、内存使用情况及分析等)
在JDK的bin目录下有很多命令行工具: 我们可以看到各个工具的体积基本上都稳定在27kb左右,这个不是JDK开发团队刻意为之的,而是因为这些工具大多数是jdk\lib\tools.jar类库的一层薄包装而已,他们的主要功能...转载 2021-08-11 11:26:42 · 647 阅读 · 0 评论 -
【Java】六、Java的BIO,NIO和AIO的区别
BIO (Blocking I/O)同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。在活动连接数不是特别高(小于单机1000)的情况下,这种模型是比较不错的,可以让每一个连接专注于自己的 I/O 并且编程模型简单,也不用过多考虑系统的过载、限流等问题。线程池本身就是一个天然的漏斗,可以缓冲一些系统处理不了的连接或请求。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是...转载 2021-07-14 18:55:33 · 206 阅读 · 0 评论 -
【Java】RandomAccessFile-递归操作指定文件夹下的所有文件内容
public static void toFiles(File rootFile) { if(rootFile == null){ return; } if(rootFile.isDirectory()){ File[] listFiles = rootFile.listFiles(); ...原创 2021-08-11 11:18:23 · 278 阅读 · 0 评论 -
【Java】再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
一直以为,java中任意unicode字符串,可以使用任意字符集转为byte[]再转回来,只要不抛出异常就不会丢失数据,事实证明这是错的。经过这个实例,也明白了为什么 getBytes()需要捕获异常,虽然有时候它也没有捕获到异常。言归正传,先看一个实例。用ISO-8859-1中转UTF-8数据 设想一个场景:用户A,有一个UTF-8编码的字节流,通过一个接口传递给用户B;用...原创 2021-08-17 23:29:23 · 3425 阅读 · 3 评论 -
【JVM】三、JVM类初始化
java类初始化类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的 Java 程序代码。虚拟机规范严格规定了有且只有四种情况必须立即对类进行初始化:遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始化。生成这四条指令最常见的 Java 代码场景是:使用 new 关键字实例...原创 2018-05-02 16:39:21 · 189 阅读 · 0 评论 -
【Java】三、Class 类文件结构
Class 类文件结构平台无关性Java 是与平台无关的语言,这得益于 Java 源代码编译后生成的存储字节码的文件,即 Class 文件,以及 Java 虚拟机的实现。不仅使用 Java 编译器可以把 Java 代码编译成存储字节码的 Class 文件,使用 JRuby 等其他语言的编译器也可以把程序代码编译成 Class 文件,虚拟机并不关心 Class 的来源是什么语言,只要它符...原创 2021-05-09 14:27:08 · 257 阅读 · 1 评论 -
【Java】经典递归-求一个数组中的所有组合值等于指定值的组合
不可变数组实现案例public class Test { static int[] flag = new int[100]; static int index = 0;// 记录当前 public static void numGroup(int[] arr, int start, int length, int sum) { if (sum =...原创 2021-08-17 23:19:44 · 8615 阅读 · 0 评论 -
【Java】Java多线程之线程死锁
恶魔之java多线程之线程死锁-简单易操作代码示例MyTest.javapackage myUtil.myUtil;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 线程死锁 * 四大条件:1线程互斥 * 2占用自然且不释放资源 * 3不强行剥夺资源 * 4原创 2021-08-11 11:22:38 · 569 阅读 · 0 评论 -
【JVM】二、JVM类加载机制
java类加载机制类加载过程类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。它们开始的顺序如下图所示: 其中类加载的过程包括了加载、验证、准备、解析、初始化五个阶段。在这五个阶段中,加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定,它在某些情况下可以在初始化阶段之后开始,这是为了支持 J...原创 2018-05-02 17:18:30 · 289 阅读 · 0 评论 -
【Java】四、多态性实现机制——静态分派与动态分派
多态性实现机制——静态分派与动态分派方法解析Class 文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在 Class 文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址。这个特性给 Java 带来了更强大的动态扩展能力,使得可以在类运行期间才能确定某些目标方法的直接引用,称为动态连接,也有一部分方法的符号引用在类加载阶段或第一次使用时转化为直接引用,这种...原创 2021-05-09 14:28:36 · 267 阅读 · 0 评论 -
【JVM】一、JVM内存模型
方法区(Method Area): 方法区属于线程共享的内存区域,又称Non-Heap(非堆),主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,根据Java 虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError 异常。值得注意的是在方法区中存在一个叫运行时常量池(Runtime Constant Pool)的区域,...原创 2018-08-06 10:51:00 · 230 阅读 · 0 评论 -
【Java】五、Java多线程并发之java内存模型
一、Java内存模型 Java内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变...原创 2021-05-09 14:29:56 · 296 阅读 · 0 评论 -
【JVM】七、JVM 之 GC日志分析
垃圾回收器的可用组合:ParNew and CMS“Concurrent Mark and Sweep” 是CMS的全称,官方给予的名称是:“Mostly Concurrent Mark and Sweep Garbage Collector”;年轻代:采用 stop-the-world mark-copy 算法;年老代:采用 Mostly Concurrent mark-...原创 2021-08-11 11:33:18 · 882 阅读 · 0 评论 -
【Java 】Java 内存区域与内存溢出
Java 内存区域与内存溢出内存区域Java 虚拟机在执行 Java 程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java 虚拟机规范将 JVM 所管理的内存分为以下几个运行时数据区:程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区。下面详细阐述各数据区所存储的数据类型。程序计数器一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,...原创 2021-08-17 23:27:03 · 307 阅读 · 0 评论 -
【Java 】二、Java 代码编译和执行的整个过程
Java 代码编译和执行的整个过程Java 代码编译是由 Java 源码编译器来完成,流程图如下所示:Java 字节码的执行是由 JVM 执行引擎来完成,流程图如下所示: Java 代码编译和执行的整个过程包含了以下三个重要的机制:Java 源码编译机制类加载机制类执行机制Java 源码编译机制Java 源码编译由以下三个过程组成:分析和输入到符号表...原创 2021-05-09 14:26:51 · 854 阅读 · 0 评论 -
【Java】一、走进 Java
概述Java 不仅仅是一门编程语言,它还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器和大型机等各种场合。时至今日,Java 技术体系已经吸引了近千万软件开发者,这是全球最大的软件开发团队。使用 Java 的设备多达几十亿台,其中包括 8 亿多台个人计算机、21 亿部移动电话及其他手持设备、...原创 2021-05-09 14:25:18 · 272 阅读 · 0 评论