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虚拟机

 

posted on 2023-07-24 23:15  wuzx-blog  阅读(79)  评论(0编辑  收藏  举报