![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 52
学习记录草稿
大e了没有闪
这个作者很懒,什么都没留下…
展开
-
调优案例分析与实战
1、高性能硬件上的程序部署策略 一个每天15万PV(Page View,页面浏览量)的在线类型文档网站,硬件升级前使用32位系统1.5GB的堆,用户感觉使用网站比较缓慢。升级为64位系统、4CPU、16GB物理内存的服务器后,管理员为了尽量利用硬件资源选用了64位的JDK,并将堆大小设置为12GB,使用一段时间后,发现网站经常不定期出现长时间失去响应的情况。 监控服务器运行服务状况后发现网站失去响应是由GC停顿导致的,虚拟机运行在Server模式,默认使用吞吐量优先收集器...原创 2021-07-20 19:37:07 · 85 阅读 · 0 评论 -
阅读GC日志
2.766: [GC (Allocation Failure) 2.766: [DefNew: 61826K->7616K(68800K), 0.0313370 secs] 92247K->38390K(221760K), 0.0314264 secs] [Times: user=0.07 sys=0.00, real=0.03 secs] 2.766 - GC发生的时间,值为从虚拟机启动以来经过的秒数; GC - 垃圾收集的停顿类型,Full GC代表...原创 2021-07-15 17:14:53 · 72 阅读 · 0 评论 -
对象的引用
定义:如果reference类型的数据中存储的数值代表另一块内存的起始地址,称这块内存代表一个引用。缺陷:过于狭隘,对象在这种定一下只有被引用和没被引用两种状态,无法描述一些“食之无味,弃之可惜”的对象。扩展:强引用:如Object obj = new Object(),存在强引用的对象永远不会被回收。软引用:由SoftReference类实现,存在软引用的对象在系统发生内存溢出前才被回收...原创 2021-07-13 20:58:11 · 34 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
JDK命令行工具 JDK的bin目录下的命令行工具(*.exe,如java.exe、javac.exe)的功能代码主要是在lib/tools.jar类库中实现的,其实是对tools.jar的一层薄封装。1、jps:虚拟机进程状况工具 JVM Process Status Tool可以列出正在运行的虚拟机进程,显示进程的LVMID(Local Virtual Machine Identifier,本地虚拟机ID)和主类(main()方法所在的类)的名称。 ...原创 2021-07-19 20:58:22 · 525 阅读 · 0 评论 -
对象的访问
程序需要通过栈上的引用来访问操作堆上的具体对象,主要有两种访问方式。使用句柄:直接指针:原创 2021-07-13 20:53:53 · 44 阅读 · 0 评论 -
类文件结构
1、虚拟机的中立特性 平台无关性:虚拟机提供商发布了各种可以在不同平台上运行的虚拟机,这些虚拟机统一运行一种与平台无关的程序存储文件即字节码文件。 语言无关性:虚拟机不和包括Java在内的任何语言绑定,只关联Class类文件这种特殊的二进制格式文件,任何语言都可以表示为Class类文件(如Groovy程序被groovyc编译器编译成Class文件)从而在虚拟机上运行。2、Class类文件结构 每个Class文件都唯一对应一个类或接口的定义信息,但类或...原创 2021-07-22 21:17:00 · 130 阅读 · 0 评论 -
对象的回收
在可达性分析算法中的不可达对象还要至少经历两次标记过程,才会真正被系统回收。第一次标记:对象在可达性分析后为不可达。筛选:筛选出没有覆盖finalize()方法且finalize()方法没有被虚拟机调用过的对象,放置在一个叫做F-Queue的队列,由虚拟机自动建立的、低优先级的Finalizer线程去执行对象的finalize()方法(任何一个对象的finalize()方法只会被系统自动调用一次)。第二次标记:由GC对F-Queue中的...原创 2021-07-13 21:00:31 · 76 阅读 · 0 评论 -
对象是否存活判定方法
1、引用计数算法对象中添加一个引用计数器,每有地方引用它,计数器的值加1,若引用失效,则计数器的值减1,任何时刻计数器为0的对象就是不再被使用的对象。优点:实现简单,判定效率高。缺点:很难解决对象之间相互循环引用的问题。2、可达性分析算法以一系列称为GC Roots的对象(java栈中引用的对象、方法区中类静态属性和常量引用的对象、本地方法栈中引用的对象)作为起点向下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链...原创 2021-07-13 20:56:10 · 51 阅读 · 0 评论 -
对象的内存分配
对象头:包括两部分信息,第一部分存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等。另一部分是类型指针,指向对象类的元数据,确定对象是哪个类的实例。不是所有虚拟机都必须保留类型指针,因为查找对象元数据信息并不一定要经过对象本身。实例数据:程序中所定义的各种类型的字段内容(包括从父类继承下来的),存储顺序受虚拟机分配策略参数和字段在程序中定义的顺序影响。虚拟机默认的分配策略,相同宽度的字段分配到一起,父类中定义的字段出现在子...原创 2021-07-13 20:47:21 · 59 阅读 · 0 评论 -
对象的创建
对象在虚拟机中的创建过程:1、执行类加载检查检查new指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用的类是否已被加载、解析和初始化过。如果没有,先执行相应的类加载过程。2、分配内存对象所需内存的大小在类加载完成后便完全确定,从java堆中分配一块确定大小的内存出来,有两种分配方式,选择哪种方式由java堆是否规整决定,而java堆是否规整又由垃圾收集器是否带有压缩整理功能决定。指针碰撞:java堆内存规整,...原创 2021-07-13 20:45:50 · 46 阅读 · 0 评论 -
字节码指令
Java虚拟机的指令由操作码(Opcode,代表某种特定操作的数字,长度为1个字节)和操作数(Operands,操作所需的参数)构成。由于Java虚拟机采用面向操作数栈而不是寄存器的指令集架构,所以大多数指令都只有操作码没有操作数。 由于限制了操作码的长度为1个字节,意味着指令集中的操作码总数不能超过256条。又由于Class文件放弃了编译后代码的操作数长度对齐,所以虚拟机在处理长度超过1个字节的数据时,必须在运行时重建数据的结构(如存储16位的无符号整数时,代码中应转变为...原创 2021-07-23 17:40:51 · 88 阅读 · 0 评论 -
HotSpot的算法实现
1、枚举根节点进行可达性分析时,在整个分析期间不可以出现对象引用关系变化的情况,因此必须停顿所有的Java执行线程(Sun称为“Stop The World”)。如果逐个检查GC Roots节点(包括方法区中的常量或类的静态属性、栈帧中的本地变量表中的属性)中的引用,会导致停顿时间过长,影响程序性能。HotSpot使用一组称为OopMap的数据结构来记录程序中的引用,类加载完成时,计算出对象内各偏移量上的数据类型,在JIT编译过程中,在特定的位置记录下栈和寄存器中哪些位置...原创 2021-07-13 21:08:05 · 121 阅读 · 0 评论 -
方法区的回收
废弃常量的回收:与堆中对象的回收类似,没有被系统引用的常量池中的常量在必要的时候将会被回收。无用的类的回收:判定:该类的所有实例已经被回收;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有被引用,无法通过反射访问该类的方法。是否对无用的类进行回收,虚拟机提供了参数进行控制。...原创 2021-07-13 21:01:41 · 36 阅读 · 0 评论 -
垃圾收集器
1、Serial收集器 一个单线程收集器,只使用一条线程完成垃圾收集工作,必须暂停其他工作线程(Stop The World)直到收集工作完成。运行在client模式下的虚拟机默认的新生代收集器,对于限定单个CPU的环境来说,Serial收集器没有线程交互的开销,可以获得最高的单线程收集效率。在桌面应用场景中,分配给运行在client模式下虚拟机的内存至多一两百兆,停顿时间最多一百多毫秒,只要不频繁发生,应用是可以接受的。2、ParNew收集器 ...原创 2021-07-15 13:49:24 · 48 阅读 · 0 评论 -
Java内存区域
本地直接分配内存:避免了在java堆和native堆中来回复制数据虚拟机运行时内存:线程共享内存:堆:存放对象实例。方法区(常量池:存放编译期生成的各种字面量和符号引用,也可以在运行时将常量放入池中,如String.intern()方法):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。线程隔离内存:java方法栈:生名周期与线程相同,描述ja...原创 2021-07-13 20:37:14 · 37 阅读 · 0 评论 -
内存分配与回收策略
对象的分配通常就是指在堆上分配(也可能经过JIT编译后间接地在栈上分配),主要分配在新生代的Eden区,如果启动了本地线程分配缓冲将按线程优先在TLAB上分配,也可能直接分配在老年代,分配的规则取决于使用的垃圾收集器的组合及虚拟机内存相关参数的设置。1、对象优先在Eden分配 大多数对象在新生代Eden区中分配,Eden区空间不够时虚拟机将发起一次Minor GC。2、大对象直接进入老年代 指定JVM运行时参数-Xms20M、-...原创 2021-07-16 17:20:59 · 78 阅读 · 0 评论 -
垃圾收集器常见参数
原创 2021-07-15 17:22:19 · 74 阅读 · 0 评论 -
垃圾收集算法
1、标记-清除算法(老年代)缺点:标记和清除过程效率低;标记清除之后会产生大量不连续的内存碎片,导致无法分配给对象足够的连续内存从而提前触发下一次垃圾回收。2、复制算法(新生代)为了解决效率问题,将可用内存划分为大小相等的两块,每次只使用其中的一块,回收时将还存活的对象复制到另一块上面,再把已使用的内存清空。优点:每次只对半区进行回收,不存在内存碎片。缺点:可用内存只有原来的一半,对象存活率较高时需要较多的复制操作。...原创 2021-07-13 21:06:05 · 50 阅读 · 0 评论