
深入理解Java虚拟机
^一剪梅^
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JVM参数优化及OOM故障分析步骤
关于 JVM 参数优化步骤1.上线前:先合理评估自己系统的压力,合理设置参数2.上线后:通过 jstat 命令监控显示系统的 eden 区增长速度,ygc 频率和耗时,老年代增长频率,耗时,然后优化参数关于 GC 问题定位排查1.通过 jstat 分析新生代、老年代对象增速,耗时和频率2.分析代码逻辑,也可以转存堆内存快照,使用 MAT 工具进行分析.OOM 分析解决1.看是那块内存抛出异常,比如堆、栈、Metaspace 区域2.如果是栈内存溢出的话,通过日志,定位栈内存溢出的地方,然后分原创 2020-08-01 16:09:43 · 386 阅读 · 0 评论 -
一次 gc 日志分析
/*** -XX:NewSize=5242880* -XX:MaxNewSize=5242880* -XX:InitialHeapSize=10485760* -XX:MaxInitialHeapSize=10485760* -XX:SurvivorRatio=8* -XX:PretenureSizeThreshold=10485760* -XX:+UseParNewGC* -XX:+UseConcMarkSweepGC* -XX:+PrintGCDetails* -XX:+PrintG原创 2020-06-27 21:19:32 · 291 阅读 · 0 评论 -
虚拟机字节码执行过程
先看个例子吧.方法定义:public int calc(int a, int b, int c){ return (a+b) * c; }javap 查看其字节码public int calc(int, int, int); descriptor: (III)I flags: ACC_PUBLIC Code: stack=2, ...原创 2020-02-29 17:38:24 · 335 阅读 · 0 评论 -
tomcat类加载机制
1.Tomcat 类加载器架构Tomcat 服务器类加载要解决的问题:1.同一个 tomcat 服务器下的不同应用所使用的类库可以实现隔离.2.同一个 toncat 服务器下的不同应用所使用的类库可以互相共享.3.服务器需要尽可能保证自身的安全不受部署的 web 应用程序影响(服务器使用到的类库应当和应用程序使用到的类库互相隔离).在 Tomcat 目录结构中,有 3 组目录:/comm...原创 2020-02-29 16:33:31 · 369 阅读 · 0 评论 -
虚拟机运行时栈帧的结构
执行引擎是 java 虚拟机最核心的组成部分之一.在虚拟机规范中制定了虚拟机字节码执行引擎的概念模型,这个概念模型称为各种虚拟机执行引擎的统一外观. 在不同的虚拟机实现里,执行引擎在执行 java 代码的时候,可能会解释执行和编译执行等,但是从外观上来看,所有的 java 虚拟机的执行引擎都是一致的:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果.运行时栈帧结构栈帧是用于...原创 2020-02-24 21:28:55 · 394 阅读 · 0 评论 -
类加载器之双亲委托模型
类加载器虚拟机设计团队把类加载阶段中的“通过一个全限定性名获取二进制字节流”这个动作的实现放到 java 虚拟机外部去实现,以便让程序自己决定如何去获取所需要的类. 这个动作的代码模块称为“类加载器”。任何一个类,都是由加载它的类加载器和这个类本身一同确立其在 java 虚拟机中的唯一性,每一个类加载器,都拥有一个独立的类名称空间.换句话说,比较两个类是否相等,只有在这两个类在同一个类加载器...原创 2020-02-23 16:57:12 · 234 阅读 · 0 评论 -
虚拟机类加载过程之解析和初始化阶段
解析阶段解析阶段是虚拟机将常量池中的符号引用转换为直接引用的过程(在验证阶段我们知道,符号引用是将对类自身以外的信息进行匹配性验证,说人话就是说比如一个类A,调用了类B的方法,那么在解析阶段需要看下类A的中的符号能否定位到B类的方法).符号引用例如Constant_Class_info、Constant_Fieldref_info、Constant_Methodref_info 等.符号引用:...原创 2020-02-22 19:18:31 · 545 阅读 · 0 评论 -
虚拟机类加载过程(二)
类加载过程也就是加载、验证、准备、解析、初始化这5阶段的具体动作:加载阶段①通过一个类的全限定名来获取定义此类的二进制字节流②将这个字节流所代表的静态存储结构转换为方法区的运行时数据结构③在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口.虚拟机规范并没有详细说明从哪里获取一个二进制字节流,充满创造力的开发人员玩出了各种花样,例如从...原创 2020-02-21 12:51:47 · 182 阅读 · 0 评论 -
虚拟机类的初始化过程(一)
上篇文章我们学习了 Class 文件的结构,现在来看下虚拟机是如何加载 Class 文件的?以及Class 文件中的信息进入到虚拟机后会发生什么样的变化?虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是 Java 虚拟机的类加载机制.我们知道,java 语言和其他在编译期就进行连接的语言不同(例如c)...原创 2020-02-20 11:18:37 · 464 阅读 · 0 评论 -
虚拟机字节码指令集
我们都知道 *.java 源代码经过编译器编译后会生成 *.class 文件,方法体中的代码会存放在方法表中 Code 属性中(接口和抽象类除外,没有 Code 属性).Code 属性的结构:attribute_name_index -> UTF8(Code)attribute_lengthinfo{max_stackmax_localscode_lengthcodeLin...原创 2020-02-18 20:01:03 · 640 阅读 · 0 评论 -
虚拟机平台无关性(二)
字段表集合字段表 (field_info) 用于描述接口或类中申明的变量. 字段(field) 包括类级别变量以及实例级别变量,但不包括在方法内部申明的局部变量.在 Java 中描述一个字段包含哪些信息?1.作用域(private/public)、实例变量还是类变量(static)、可变性(final)、并发可见性(volatile)字段数据类型(基本类型、对象、数组)、字段名称.字段表结...原创 2020-02-18 11:56:26 · 181 阅读 · 0 评论 -
【JVM虚拟机】(7)---深入理解Class中-属性集合
转载:https://www.cnblogs.com/qdhxhz/p/10693324.html之前有关class文件已经写了两篇博客:1、【JVM虚拟机】(5)—深入理解JVM-Class中常量池2、【JVM虚拟机】(6)—深入理解Class中访问标志、类索引、父类索引、接口索引那么这篇博客主要讲有关 字段表集合 相关的理解和代码示例。字段表:用于描述接口或者类中声明的变量,字段包括...转载 2020-02-17 22:42:59 · 200 阅读 · 0 评论 -
虚拟机的平台无关性(一)
我们知道,java 语言一次编写,到处运行,那它是如何做到的了?早在java语言设计之初,设计者就考虑到了这方法的事,他们将java规范拆分为java语言规范和java虚拟机规范,而虚拟机只和class文件进行绑定,所以不管是java语言,还是c语言,只要有编译器把java语言或c语言编译成.class文件即可,然后class文件运行在 java虚拟机上就可以运行了.那下面说下 class 的文...原创 2020-02-17 19:36:50 · 301 阅读 · 0 评论 -
Java 对象大小的计算方式
首先我们需要知道的是 Java 对象是包含三部分数据的:1.对象头2.实例数据3.对齐填充(可能没有,因为 java 中规定对象的起始地址必须是 8 bytes 的正数倍)对于普通对象而言,对象头中包括 mark word(8 bytes)、kclass(没有开启压缩的时候是 8 bytes,开启压缩了的话,就是 4 bytes),如果是数组类型的对象话,这里还有一个数组长度字段,4字节....原创 2020-02-13 12:11:46 · 564 阅读 · 1 评论 -
Java 监控工具介绍
1.jps 查看java 虚拟机进程2.jstat查看类加载情况jstat -class 1111查看编译情况jstat -compile 1111查看 gc 情况jstat -gc 1111查看堆内存情况jstat -gccapacity 11113.jinfo 查看 java 配置信息jinfo 11114.jmap 生成堆转储存快照jmap 11115.jhat...原创 2020-02-13 11:23:40 · 292 阅读 · 0 评论 -
Java内存模型-内存间的交互
3.内存间的交互操作看到这块,小伙伴是否有这么一个疑问?不同的工作内存缓存了主内存中相同的数据,那么是否有类似于 MESI 这样的协议来保证数据一致性了?我们先来看下内存间的交互操作吧.内存间的交互是数据从主内存拷贝到工作内存,然后从工作内存同步会主内存的具体实现细节.Java 内存模型定义了 8 中操作来完成,虚拟机实现时必须保证这 8 中操作都是原子操作(对于 double 和 lon...原创 2020-02-04 15:45:36 · 276 阅读 · 0 评论 -
虚拟机性能监控与故障处理工具
1.JDK的命令行工具我们常用的工具是 java.exe 和 javac.exe 这两个,但是不知道你们有没有注意到 bin 目录下的工具其实不止这两个. 例如 xjc.exe、wsimport.exe、wsgen.exe 等. 这些工具非常的小巧,大部分都稳定在 27KB 左右,并非 JDK 开发团队为了炫耀编程水平,故意把它们制作的如此精炼,而是因为这些命令行工具大多数是 jdk/lib...原创 2019-12-01 21:07:58 · 263 阅读 · 0 评论 -
垃圾收集器和内存分配策略
GC 需要考虑三件事:(1)什么样的对象需要回收?(2)什么时候回收?(3)怎么回收?我们知道:程序计数器、栈、本地方法栈这三个区域的生命周期和线程是一样的,所以这块的内存的回收可以不用考虑. 关于栈的内存分配,栈中局部变量表的大小,一般来说在编译器就可知,所以这块的内存分配我们也可以不用考虑. 我们需要专注的是是对堆内存和方法区内存的分配和回收.我们现在来看第一个问题,什么样的对象需...原创 2019-11-24 23:49:46 · 243 阅读 · 0 评论 -
基于句柄方式访问Java对象为啥会使用两个指针?
基于句柄方式访问Java对象为啥会使用两个指针?我觉得一个指针就可以实现了呀,句柄指向对象的实例数据,然后对象的类型指针指向方法区中的类元数据信息不就好了吗?为啥句柄中还需要定义一个类型指针,单独指向方法区中的类类元数据信息了?...原创 2019-11-09 16:13:24 · 297 阅读 · 1 评论 -
Java 内存管理
说明:本篇文章是在阅读《深入理解Java虚拟机》过程中的一些笔记和分析,由于本人能力有限,如果有书写错误的地方,欢迎各位大佬批评指正!我们互相交流,学习,共同进步!该项目的地址:https://github.com/xiaoheng1/jvm-readJava 的内存结构分为运行时数据区+执行引擎+本地库接口+本地方法库运行时数据区分为:堆、栈、本地方法栈、程序计数器、方法区组成.(1)程...原创 2019-11-09 19:29:57 · 198 阅读 · 0 评论