- 博客(11)
- 收藏
- 关注
原创 深入理解JVM—寻找性能瓶颈并进行优化
假设提供的是10个,那么就意味着同时能够进行数据库操作的就只有10个线程,而如果此时有50个线程要进行数据库操作,那就会造成另外的40个线程处于等待状态,这种情况下对于4核类型的机器而言,CPU的消耗并不会高,但程序的执行仍然会较慢。另外一个可能也会造成us高的原因是频繁的GC。操作太大的文件也是造成文件IO效率低的一个原因,因此对于每个输出的文件,都应做大小的限制,在超出最大值后可生成一个新的文件,类似log4j中RollingFileAppender的maxFileSize属性的作用。
2023-04-06 18:30:23
583
原创 深入理解JVM—调优简介
STW影响用户体验和使用性能,但为了GC时,不让用户线程的执行影响对象的状态,只能减少时间,提高用户体验]一般不使用Jmap:过程STW,且线上系统内存庞大,Jmap执行期间对进程产生影响和卡顿。3.解决JVM运行过程中出现的各种问题(OOM),减少Full GC ,最终减少。一般不使用远程监控图形化界面,需连接主机开权限和端口。设置参数HeapDump,oom时自动产生堆转储文件。2.优化运行JVM运行环境(慢,卡顿)1.根据需求进行JVM规划和预调优。
2023-03-30 14:46:01
174
原创 深入理解JVM—虚拟机字节码执行引擎
虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。Java虚拟机以方法作为最基本的执行单元,“栈帧”(Stack Frame)则是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈(Virtual Machine Stack)的栈元素。
2023-03-30 14:30:55
194
原创 深入理解JVM—虚拟机类加载机制
这其实是⼀个很顺理成章的变动,既然整个JDK都基于模块化进⾏构建(原来的rt.jar和tools.jar被拆分成数⼗个JMOD⽂件),其中的Java类库就已天然地满足了可扩展的需求,那自然⽆须再保留 <JAVA_HOME>\lib\ext⽬录,此前使⽤这个⽬录或者java.ext.dirs 系统变量来扩展JDK功能的机制已经没有继续存在的价值了,⽤来加载这部分类库的扩展类加载器也完成了它的历史使命。JDK 9中虽然仍然维持着三层类加载器和双亲委派的架构,但类加载的委派关系也发⽣了变动。
2023-03-30 14:26:15
130
原创 深入理解JVM—类文件结构
在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别些类或者接口层次的访问信息,包括:这个Class是类还是接口;由于常量池中常量的数量是不固定的,所以在常量池的⼊⼝需要放置⼀项u2类型的数据,代表常量池容量计数值(constant_pool_count),这个容量计数是从1⽽不是0开始的。, 它是Class文件结构中与其他项⽬关联最多的数据,通常也是占⽤Class文件空间最⼤的数据项⽬之⼀,另外,它还是在Class文件中第⼀个出现的表类型数据项⽬。
2023-03-30 14:21:37
74
原创 深入理解JVM—内存分配与回收策略
新⽣代使用复制收集算法,但为了内存利用率, 只使用其中⼀个Survivor空间来作为轮换备份,因此当出现⼤量对象在Minor GC后仍然存活的情况——最极端的情况就是内存回收后新⽣代中所有对象都存活,需要⽼年代进⾏分配担保,把Survivor无法容纳的对象本身还有容纳这些对象的剩余空间,但⼀共有多少对象会在这次回收中活下来在实际完成内存回收之前是⽆法明确知道的,所以只能取之前每⼀次回收晋升到⽼年代对象容量的平均⼤⼩作为经验值,与⽼年代的剩余空间进⾏⽐较,决定是否进⾏Full GC来让⽼年代腾出更多空间。
2023-03-30 14:16:29
102
原创 深入理解JVM—经典垃圾收集器
就是当灰色对象要删除指向白色对象的引用关系时,就将这个要删除的引用记录下来,在并发扫描结束之后,再将这些记录过的引用关系中的灰色对象为根,重新扫描一次,这样就能扫描到白色的对象,将白色对象直接标记为黑色(目的就是让这种对象在本轮GC清理中能存活下来,待下一轮GC的时候重新扫描,这个对象也有可能是浮动垃圾),这可以简化理解为,来制定回收计划,可以⾃由选择任意多个Region构成回收集,然后把决定回收的那⼀部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。
2023-03-30 14:13:34
190
原创 深入理解JVM—垃圾回收算法
HotSpot虚拟机默认Eden和Survivor的⼤⼩⽐例是8∶1,也 即每次新⽣代中可⽤内存空间为整个新⽣代容量的90%(Eden的80%加上⼀个Survivor的10%),只有⼀个Survivor空间,即10%的新⽣代是会被“浪费”的。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把便用的空间一次清理掉。算法分为标记和清除阶段:标记存活的对象,统一回收所有未被标记的对象(一般选择这种):也可以反过来,标记出所有需要回收的对像,在标记完成后统一回收所有被标记的对像。
2023-03-30 14:07:34
122
原创 深入理解JVM—垃圾回收机制详解
如果对象要在finalize()中成功拯救⾃⼰——只要重新与引⽤链上的任何⼀个对象建⽴关联即可,譬如把⾃⼰(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出即将回收的集合;:通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,说明从GC Roots到这个对象不可达时,则此对象是不可能再被使用的。
2023-03-30 13:59:57
378
原创 虚拟机在Java堆中对象分配、布局和访问
JAVA堆内存规整,已使用的和空闲的内存分为在两侧,中间由一个指针作为分界点,为新生对象分配内存只需将指针向空闲内存挪动一段与对象大小相等的距离就可以。,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。JAVA堆内存不规整,使用的内存和空闲的内存交错在一起,虚拟机需要维护一个空闲列表,记录可用内存,在分配时从列表上选取。,如无,先进行类加载过程,若已类加载通过,才可以为对象分配内存。
2023-03-30 12:35:31
119
原创 深入理解JVM—内存区域
本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现OutOfMemory。线程私有,采用栈的数据结构,先入后出,一个方法对于一个栈帧,执行方法进栈创建栈帧,用于存储。管理的内存区域,分代。
2023-03-30 12:26:20
111
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人