Java面试题 P2:Jvm性能调优
1、JDK体系结构
JDK由:java命令及常用工具+JRE组成(java运行时环境)
JRE由:支撑java运行的各种类库+JVM(java运行时环境)
2、为什么java可以跨平台部署
跨平台是由java虚拟机,jvm去实现的。
3、Java虚拟机内部组成结构图
java代码运行工作顺序:
(1)先通过javac将Math.java编译为Math.class字节码文件;
(2)再通过java命令运行Math.class字节码文件;
(3)java虚拟机开始工作,将字节码文件通过类装子系统加载到第2块位置,运行时数据区
(4)通过字节码执行引擎,运行java虚拟机中内存中的java代码
堆:new出来的对象一般放堆中
栈:用来放变量,临时变量,局部变量。
示例代码:
一个方法对应一块栈帧内存区域。
栈的数据结构的特点:先进后出(FILO)
javap命令可以对java代码进行反汇编。命令为:javap -c Math.class > Math.txt
上面程序的反汇编
程序计数器,放正在运行或将要运行的程序的行号。当CPU时间片被其他线程抢走后恢复执行时的执行行。
栈和堆的关系:指针
方法区:放常量,变量,类信息
方法区和堆的关系:指针指向堆的位置
本地方法:native来修饰的方法 例如start0()
堆的组成:
调优工具
(1)Java自带,JvisualVM
原理上子jdk1.6以上自带,但是我安装的版本中没有,先截取一个图看看
(2)Arthas(阿里)
官网:https://arthas.aliyun.com/doc/
下载地址:https://github.com/alibaba/arthas/releases
下载后运行 arthas-bin 文件夹下的arthas-boot
输入监控的jvm号
选择数字1回车进入到启动界面,
输入:dashboard,进入监控面板
当发现cpu异常,例如 线程号20,新启动cmd命令,进入到arthas运行界面,输入thread 20
进入到有问题的代码位置。
thread -b 命令 查询死锁的代码
使用Arthas进行代码反编译为你的原始密码
jad 类的位置
通过ognl来修改运行程序中内存变量的值
java虚拟机调优的真正目的是什么?
减少full gc,真正是减少STW,stop the world(停止到整个世界,会停止用户线程)
jvm为什么会设置STW机制?
指针会没有指向,堆 栈帧都可能会被清理,对象可能为垃圾,也可能会变成非垃圾,所以在做GC时,暂停所有用户线程。
市面上差不多有10种垃圾收集器:
G1虚拟机