![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
jvm
文章平均质量分 77
yuan同学
留下一点点思考。
展开
-
JVM-字节码文件解析
什么是字节码指令? 操作码+操作数 Class文件的总体结构 1.魔数 2.Class文件版本:主版本,副版本,高版本虚拟机可以解释低版本class文件 3.常量池:是class文件的基石。 常量池计数器:记录常量池表的大小。常量池计数值从1开始,如果有长度为22,则下标是1-21,0项常量空出来。 常量池表:用于存放编译时期生成的各种字面量和符号引用,这个部分内容将在类加载后进入方法区的运行时常量池中存放。 A.字面量:文本字符串、声明为final的常量值 B.符号引用:类和接口的全限定名、字段的名称和描原创 2021-04-06 20:12:46 · 162 阅读 · 1 评论 -
JVM-性能调优-4-分析GC日志
GC日志分类 MinorGC FullGC GC日志分析工具 GCEasy-- 一款超好用的在线分析GC日志的网站 官网地址:https://gceasy.io/ GCeasy是一款在线的GC日志分析器,可以通过GC日志分析进行内存泄漏检测、GC暂停原因分析、JVM配置建议优化等功能,而且是可以免费使用的(有一些服务是收费的)。 GCViewer 下载地址:https://github.com/chewiebug/GCViewer/wiki/Changelog 是一个免费的、开源的分析小工具,用于可视原创 2021-03-02 16:22:24 · 82 阅读 · 0 评论 -
JVM-性能调优-3-运行时参数
官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html 1.JVM参数选项类型 类型一:标准参数选项 特点: 比较稳定,后续版本基本不会变化,以-开头 各种选项: 运行java或者java -help可以看到所有的标准选项 类型二:-X参数选项 特点: 非标准化参数,功能还是比较稳定的。但是官方说后续版本可能会变更,以-X开头。 各种选项: 运行java -X命令可以看到所有的X选项。 JVM的JIT编译模式相关的选原创 2021-03-02 11:19:59 · 90 阅读 · 0 评论 -
JVM-性能调优-GUI篇
JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。下面介绍几款功能相对多一些、丰富一些。 图形化综合诊断工具 JDK自带的工具 官方文档:https://docs.oracle.com/javase/7/docs/technotes/guides/management/ 1.jconsole:JDK自带的可视化监控工具。查看Java应原创 2021-02-25 14:39:38 · 98 阅读 · 0 评论 -
JVM-性能调优-命令行篇
1.JPS(Java Process Status) 显示指定系统内所有的HotSpot虚拟机进程(查看虚拟机进程信息),可用于查询正在运行的虚拟机进程。 说明:对于本地虚拟机进程来说,进程的本地虚拟机ID与操作系统的进程ID是一致的,是唯一的。 基本语法 jps [options] [hostid] ===jps [-q] [-mlvV] [<hostid>] options参数 -q : 仅仅显示LVMID(local virtual machine id),即本地虚拟机唯一id。不显示主类原创 2021-02-20 11:48:58 · 75 阅读 · 0 评论 -
JVM-类加载器
类的生命周期: 1.加载:就是讲Java类的字节码文件加载到机器内存中,并在内存中构建出Java类的原型–类模板对象。 完成的操作: A.通过类的全名,获取类的二进制数据流。 B.解析类的二进制数据流为方法区内的数据结构。 C.创建java.lang.Class类的实例,表示该类型。作为方法区这个类的各种数据的访问入口。 Class实例的位置: 类将.class文件加载至元空间后,会在堆中创建一个Java.lang.Class对象,用来封装类位于方法区内的数据结构,该Class对象是在加载类的过程中创建的,原创 2021-01-15 11:21:12 · 54 阅读 · 0 评论 -
JVM-运行时数据区
内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁。 线程共享区: 1.堆(垃圾回收95%): A.在JVM启动时候就创建了,大小确定了,但可以调节大小。 B.可以处于物理上不连续的内存空间,但在逻辑上是视为连续的 C.所有线程共享java堆,在这里还可以划分线程私有的缓冲区TLAB(也就是java堆并不是都是共享的) D.java7及之前内存逻辑上分为三部分:新生区(分为1个Eden区和2个Survivor区)+养老区+永久区(是方法区的逻辑实现) java8及之后内存逻辑上分为三部分:新生区+养老原创 2021-01-14 12:17:44 · 67 阅读 · 0 评论 -
JVM-执行引擎
执行引擎的任务就是将字节码指令解释/编译为对应平台上的本地机器指令。充当了将高级语言翻译为机器语言的译者。 Java代码编译和执行得到过程: 程序源码-》词法分析-》单词流-》语法分析-》抽象语法树-》中间代码-》生成器-》目标代码(编译器) -》指令流-》解释器-》解释执行(解析器) 什么是解释器,什么是JIT编译器? 解释器:当java虚拟机启动时会根据预定义的规范对字节码采用逐行解释的方式执行,将每条字节码文件中的内容“翻译”为对应平台的本地机器指令执行。 JIT编译器:原创 2021-01-12 12:17:07 · 71 阅读 · 0 评论 -
JVM-Class文件加载过程
加载:从磁盘中加载class文件到内存中,生成class对象 链接: 1.验证 : 确保class文件中包含的信息符合当前虚拟机的要求 2.准备 : 为类变量分配内存并且设置该类变量的默认初始值,即为0(最终赋值是在init阶段)和静态代码块赋值。 这里不包括用final修饰得到statis变量(相当于常量了),在这个阶段是直接赋值了,不用到初始化阶段 3.解析 : 将常量池中的符号引用转换为直接引用的过程(主要针对接口,方法等调用的文件)(虚方法表的创建) 初始化: 1.初始化阶段是执行类构造器方法()的原创 2021-01-12 12:02:37 · 198 阅读 · 1 评论 -
JVM-JDK版本中String的变化
String的变化 1.String在jdk8及以前内部定义了final char[] value用于存蓄字符串数据。jdk9时改为byte[] (从两个字节改为一个字节) 2.String对象是不可变的, 拼接或者替换都会在字符串常量池中新创建一个String对象的。 3.字符串常量池中是不会存蓄相同内容的字符串的。因为String的String Pool是一个固定大小的Hashtable,底层是用map装的数据,key值是唯一的。在JDK6是默认大小为1009,可以设置大小。JDK7StringTabl原创 2021-01-12 10:53:13 · 401 阅读 · 0 评论