JVM最佳实践
文章平均质量分 89
JVM最佳实践
飞哥学什么
这个作者很懒,什么都没留下…
展开
-
11JVM中常用垃圾回收器分析与实践
JVM系统为了对内存中的垃圾进行回收,基于GC算法,开发了一些垃圾回收器,例如:其中:Serial GC是最古老也是最基本的收集器,但是现在依然广泛使用,JAVA SE5和JAVA SE6中客户端虚拟机采用的默认配置。1. Serial GC(串行收集器)应用特点:2. Serial GC(串行收集器)场景应用:3. Serial GC(串行收集器)算法应用新生代使用 mark-copy(标记-复制) 算法(新生代存活对象较少)。老年代使用 mark-sweep-compact(标记-清除-整理)算法(老原创 2023-03-22 13:45:54 · 215 阅读 · 0 评论 -
10GC简介
Young区存储的就是那些生命周期短,使用一两次就不再使用的对象,回收一次基本上该区域十之有八的对象全部被回收清理掉,因此Young区采用的垃圾回收算法也就是“标记-复制”算法。Old区存储的是那些生命周期长,经过多次回收后仍然存活的对象,就把它们放到Old区中,Old区一般不去判断这些对象的可达性,直到Old区不够用为止,再进行一次统一的回收,释放出足够的连续的内存空间。比方说,java中的垃圾回收会对内存中的对象进行遍历,对存活的对象进行标记,其未标记对象可认为是垃圾对象,然后基于特定算法进行回收。原创 2023-03-17 13:13:49 · 156 阅读 · 0 评论 -
09JVM内存泄漏分析与实践
动态分配的内存空间,在使用完毕后未得到释放,结果导致一直占据该内存单元,直到程序结束。这个现象称之为内存泄漏。因此良好的代码规范,可以有效地避免这些错误。原创 2023-03-17 13:13:14 · 360 阅读 · 0 评论 -
08JVM中的内存溢出
内存中剩余的内存不足以分配给新的内存请求就会内存溢出。内存溢出可能直接导致系统崩溃。原创 2023-03-17 13:11:43 · 132 阅读 · 0 评论 -
07JVM内存逃逸分析与实践
随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。原创 2023-03-17 13:11:05 · 107 阅读 · 0 评论 -
06JVM运行时内存分析
Java 虚拟机栈(Java Virtual Machine Stacks)描述的是 Java 方法执行时的内存模型,解决的是程序运行时数据的操作问题,即程序如何执行,或者说如何处理数据。而堆解决的是数据存储的问题,即数据怎么放,放哪里。Java堆(Java Heap)是JVM 中内存最大的一块,被所有线程共享,在虚拟机启动 时创建,主要用于存放对象实例,大部分对象实例也都是在这里分配。原创 2023-03-17 13:10:25 · 97 阅读 · 0 评论 -
05JVM常用工具应用
它可以显示本地或者远程(需要远程主机提供 RMI 支持)虚拟机进程中的类信息、内存、垃圾收集、JIT 编译等运行数据,在没有 GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。的作用并不仅仅是为了获取 dump 文件,它还可以查询 finalizer 执行队列、Java 堆和永久代的详细信息,如空间使用率、当前使用的是哪种收集器等。生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的原因。原创 2023-03-17 12:56:51 · 1348 阅读 · 0 评论 -
04字节码增强技术分析与实践
字节码增强技术相当于是一把打开运行时JVM的钥匙,利用它可以对现有字节码进行修改或者动态生成新的字节码,进而对运行中的程序做修改,实现热部署。也可以跟踪JVM运行中程序的状态,进行性能诊断等。此外,我们平时使用的动态代理、AOP也与字节码增强密切相关,它们实质上还是利用各种手段生成符合规范的字节码文件。综上所述,掌握字节码增强后可以高效地定位并快速修复一些棘手的问题(如线上性能问题、方法出现不可控的出入参需要紧急加日志等问题),也可以在开发中减少冗余代码,大大提高开发效率。原创 2023-03-17 12:56:06 · 398 阅读 · 0 评论 -
03字节码解读分析与实践
Java的源代码中编译后会生成一个class文件,文件内容为一些JAVA虚拟机指令,这些指令的内容,由多个十六进制值组成,两个十六进制值为一组,例如:Java虚拟机的指令由一个字节长度、代表某种特定操作含义的操作码(opcode)以及跟随其后的零个或多个的操作数(operand)构成。Java之所以可以“一次编译,到处运行”,一是因为JVM针对各种操作系统、平台都进行了定制。二是因为无论在什么平台,都可以编译生成固定格式的字节码(.class文件)供JVM使用。原创 2023-03-17 12:57:20 · 168 阅读 · 0 评论 -
02类加载子系统分析与实践
类加载子系统是负责将类从磁盘或网络读到JVM内存,然后交给执行引擎执行,如图所示。说明:学习类加载有助于我们更深入地理解JAVA类成员的初始化过程,运行过程。并可以为后续的线上问题的解决及调优提供一种基础保障。我们可以通过继承java.lang.ClassLoader抽象类的方式,实现自己的类加载器,以满足一些特殊的需求。建议把自定义的类加载逻辑写在findclass()方法中。/*** ClassLoader没有抽象方法为什么还要将此类定义为抽象类?* 外界不允许直接构建此类对象。原创 2023-03-17 12:49:53 · 87 阅读 · 0 评论 -
01JVM简介
你用的什么JVM(JAVA虚拟机)?(HotSpot)你了解市面上有哪些JVM?JDK,JRE,JVM之间是什么关系?你觉得下一代JVM的发展方向应该是怎样的?(支持更多编程语言)JVM规范JVM由哪及部分构成?(类加载子系统,运行时数据区、执行引擎、本地方法接口)为什么我们要学习JVM?原创 2023-03-17 12:43:22 · 324 阅读 · 3 评论