
JVM
文章平均质量分 59
JVM
core321
应无所住,而生其心。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
windows环境tomcat指定JDK
windows环境tomcat指定JDK原创 2022-10-19 13:43:28 · 732 阅读 · 0 评论 -
Oracle最后一个商用免费版本JDK1.8.202
JDK 免费版本原创 2022-08-08 09:38:26 · 1059 阅读 · 0 评论 -
JVM调优实战及常量池详解
阿里巴巴Arthas详解Arthas是Alibaba在2018年9月开源的Java诊断工具。支持JDK6+,采用命令行交互模式,可以方便的定位和诊断线上程序运行问题。Arthas官方文档十分详细,详见:https://arthas.aliyun.com/doc/Arthas使用github 下载 arthaswget https://alibaba.github.io/arthas/arthas-boot.jar或者 Gitee 下载wget https://arthas.gitee.io/原创 2021-09-14 10:18:30 · 186 阅读 · 0 评论 -
JVM调优工具详解及调优实战
前置启动程序事先启动一个web应用程序,用jps查看其进程id,接着用各种jdk自带命令优化应用Jmap此命令可以用来查看内存信息,实例个数以及占用内存大小打开log.txt,文件内容如下:num:序号instances:实例数量bytes:占用空间大小class name:类名称,[C is a char[],]...原创 2021-09-08 00:09:33 · 386 阅读 · 0 评论 -
启动普通的jar程序JMX端口配置常见问题
1.找不到口令文件 jmxremote.passwordjmxremote.password.template复制,去掉.template后缀2.必须限制口令文件读取访问jmxremote.password找到jmxremote.password右键属性:切换到“安全”选项卡,点击“高级”选中当前用户,点击“禁用继承”...原创 2021-09-07 11:12:01 · 780 阅读 · 0 评论 -
jstack Unable to attach to 64-bit process
当前运行环境JDK版本与程序所运行的JDK不是一个。原创 2021-09-06 23:58:31 · 863 阅读 · 0 评论 -
如何选择垃圾收集器
1.优先调整堆的大小让服务器自己来选择2.如果内存小于100M,使用串行收集器3.如果是单核,并且没有停顿时间的要求,串行或JVM自己选择4.如果允许停顿时间超过1秒,选择并行或者JVM自己选5.如果响应时间最重要,并且不能超过1秒,使用并发收集器6.4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC下图有连线的可以搭配使用JDK 1.8默认使用 Parallel(年轻代和老年代都是)JDK 1.9默认使用 G1安全点与安全区域就原创 2021-09-03 16:38:04 · 331 阅读 · 0 评论 -
垃圾收集器G1&ZGC详解
G1收集器(-XX:+UseG1GC)G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC 停顿时间要求的同时,还具备高吞吐量性能特征.G1将Java堆划分为多个大小相等的独立区域(Region),JVM最多可以有2048个Region。一般Region大小等于堆大小除以2048,比如堆大小为4096M,则Region大小为2M,当然也可以用参数"- XX:G1HeapRegionSize"手动指定Region大小,但是推原创 2021-09-03 16:30:10 · 415 阅读 · 0 评论 -
垃圾收集器ParNew&CMS与底层三色标记算法
垃圾收集算法分代收集理论当前虚拟机的垃圾收集都采用分代收集算法,这种算法没有什么新的思想,只是根据对象存活周期的不同将内存分为几 块。一般将java堆分为新生代和老年代,这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。比如在新生代中,每次收集都会有大量对象(近99%)死去,所以可以选择复制算法,只需要付出少量对象的复制成本就可 以完成每次垃圾收集。而老年代的对象存活几率是比较高的,而且没有额外的空间对它进行分配担保,所以我们必须选 择“标记-清除”或“标记-整理”算法进行垃圾收集。注意,“标原创 2021-09-03 14:13:01 · 165 阅读 · 0 评论 -
JVM对象创建与内存分配机制深度剖析
对象的创建1.类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的加载过程。2.分配内存在类加载检查通过后,接下来虚拟机将为新生代对象分配内存。对象所需内存的大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。这个步骤有两个问题:(1)如何划分内存;(2)在并发的情况下,可能出现正在给对象A分配内存,指针还没来得原创 2021-08-31 17:58:46 · 145 阅读 · 0 评论 -
JVM内存模型剖析与优化
1.JVM整体结构及内存模型2.JVM内存参数设置Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里): 1 java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar 关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和原创 2021-08-30 21:18:54 · 111 阅读 · 0 评论 -
jvisualvm安装Visual GC插件
1.到JDK对应的bin目录,双基进入jvisualvm页面,如下图所示2.点击菜单“工具”->“插件”,切换到“可用插件”,选中“Visual GC”,点击下面的“安装”按钮,如下图所示:3.步骤2失败,则继续下面步骤根据提示的地址自己下载4.按照如下步骤添加已下载的插件5.安装后效果6.VisualGC效果方便大家下载,附已下载VisualGC插件地址:https://download.youkuaiyun.com/download/taotao_guiwang/21734245原创 2021-08-30 11:49:50 · 543 阅读 · 0 评论 -
JVM(四)本地方法栈
是什么?用于作用于本地方法执行的一块Java内存区域什么是本地方法为什么?与Java虚拟机栈相同,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈出栈的过程特点?Hotshot将Java虚拟机和本地方法栈合二为一...原创 2019-11-06 23:23:00 · 186 阅读 · 0 评论 -
JVM(七)运行时常量池
是什么?运行时常量池是方法区的一部分,Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。运行时常量池模拟public class C { public static void main(String[] args) { // 常量保存在StringTable(...原创 2019-11-07 12:49:44 · 204 阅读 · 0 评论 -
JVM(六)内存区域方法区
是什么?1.是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据2.什么是类信息:类版本号、方法、接口为什么?1.内存中存放类信息、静态变量等数据,属于线程共享的一块区域2.Hotspot使用永久代来实现方法区3.JRockit、IBM没有永久代概念,在堆内管理特点?1.并非数据进入了方法区就如永久代的名字一样“永久”存在了。这区...原创 2019-11-07 12:25:48 · 151 阅读 · 0 评论 -
JVM(一)内存区域分布
JVM内存模型概述JVM运行时数据区分布图:线程共享数据区:方法区、堆线程隔离数据区:虚拟机栈、本地方法栈、堆、程序计数器原创 2019-11-06 18:11:41 · 137 阅读 · 0 评论 -
JVM(八)对象是怎么来的?
简介:Java程序员不可不知的对象创建底层步骤细节1.对象创建的流程步骤包括哪些(1)虚拟机遇到一条new指令时,首先检查这个对应的类能否在常量池定位到一个类的符号引用(2)判断这个类是否已被加载、解析和初始化(3)为这个新生对象在Java堆中分配内存空间,其中Java堆分配内存空间的方式主要有以下两种:指针碰撞分配内存空间包括开辟一块内存和移动指针两个步骤非原子步骤可能出现并发问...原创 2019-11-07 15:44:47 · 179 阅读 · 0 评论 -
JVM(十一)对象访问定位方式
当我们在堆上创建一个对象实例后,就要通过虚拟机栈中的reference类型数据来操作堆上的对象。现在主流的访问方式有两种(Hotspot虚拟机采用的是第二种)1.使用句柄访问对象。即reference中存储的是对象句柄的地址,而句柄中包含了对象实例数据与类型数据的具体地址信息,相当于二级指针。2.直接指针访问对象。即reference中存储的就是对象地址,相当于一级指针。对比1.垃圾回收...原创 2019-11-07 17:12:42 · 183 阅读 · 0 评论 -
JVM(九)JAVA对象内存布局
1.对象头用于存储对象 的元数据信息:Mark Word部分数据的长度在32位和64位机器(未开启压缩指针)中分别为32bit和64bit,存储对象自身的运行时数据如哈希值等。Mark Word一般被设计为非固定的数据结构,以便存储更多的数据信息和复用自己的存储空间。类型指针 指向它的类元数据的指针,用于判断对象属于哪个类的实例。2.实例数据存储的是真正有效的数据,如各种字段内容,各字...原创 2019-11-07 16:48:11 · 188 阅读 · 0 评论 -
JVM(三)JAVA虚拟机栈
是什么?用于作用于方法执行的一块Java内存区域为什么?每个方法在执行的同时都会创建一个栈帧(Stack Framel)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着一个帧栈在虚拟机中入栈到出栈的过程特点?局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、dou...原创 2019-11-06 19:27:17 · 135 阅读 · 0 评论 -
JVM(五)Java堆
是什么?是Java内存区域中一块用来存放对象实例的区域,【几乎所有的对象实例都在这里分配内存】为什么?此内存区域的唯一目的就是存放对象实例Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块,Java堆是所有线程共享的一块内存区域特点?Java堆是垃圾收集器管理的主要区域,因此很多时候也被称作“GC堆”在启动SpringBoot项目情况下,查看进程ID命令:jps...原创 2019-11-06 23:53:00 · 196 阅读 · 1 评论 -
JVM(十二)垃圾回收-引用计数法
1.战略意义能做出一个需求的同时也要懂得其对应的战略意义2.为什么要垃圾回收Java语言中一个显著的特点就是引入垃圾回收机制,使C++程序员 最头疼的内存管理的问题迎刃而解。由于有垃圾回收机制,Java中的对象不再有“作用阈”的概念,只有对象的引用才有作用域。垃圾回收可以有效防止内存泄漏,有效使用空闲的内存垃圾回收的过程是怎样的?如果让你考虑垃圾回收算法你会怎么设计对象是否判断存...原创 2019-11-07 17:28:27 · 205 阅读 · 0 评论 -
JVM(二)内存模型之程序计数器
1.是什么?程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成为什么?为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立存储,我们称这类内存区域为“线程...原创 2019-11-06 18:42:38 · 165 阅读 · 0 评论 -
双亲委派机制
双亲委派机制JVM类加载器是有亲子层级结构的,如下图这里类加载其实就有一个双亲委派机制,加载某个类时会先委托父加载器寻找目标类,找不到再 委托上层父加载器加载,如果所有父加载器在自己的加载类路径下都找不到目标类,则在自己的 类加载路径中查找并载入目标类。 比如我们的Math类,最先会找应用程序类加载器加载,应用程序类加载器会先委托扩展类加载 器加载,扩展类加载器再委托引导类加载器,顶层引导类加载器在自己的类加载路径里找了半天 没找到Math类,则向下退回加载Math类的请求,扩展类加载器收到回复就.原创 2021-08-27 15:10:46 · 189 阅读 · 0 评论