执行引擎

 

CodeCache 相对于其他内存(可读可写,可执行)

 

操作系统内存模型和JVM内存模型之间的关系;

 

操作系统内存模型

      堆区

           JVM内存模型,其实就是从堆区切了一块大内存下来(内存池)

             堆区

                   方法区(jdk7)

             虚拟机栈

       本地方法栈

                 程序计数器

            方法区(jdk8)

-----------------------

       栈

       全局区

       代码块

 

IDEA点执行main函数:先javac编译,在java执行

 

JVM启动

JVM初始化

 

HSDB 窥探JVM内部 (类比HSDIS)

 

oop-klass模型

klass模型:Java的类在JVM中的存在形式

因为openJDK是用汇编、c、c++写的,JVM不认识java类的,需要 Java类->C++类,在JVM内部流通

 

类加载器

  七个阶段:

  类何时被加载,何时被解析

  初始化到底是什么

  

  三个类加载器

  双亲委派

  SPI

  自定义类加载器

 

字节码文件(.class)加载入JVM中是如何存储的?

 

  字节流:ClassFileStream* cfs = stream();

  基于《Java虚拟机规范》对这个stream进行解析

  1、InstanceKlass存储java类的元信息(方法区,不是Class对象)

  2、InstanceMirrorKlass镜像类(堆区,Class对象)

   静态属性,在堆区

 

一、

方法区:Java虚拟机规范(接口)

 

永久代

元空间:方法区在JVM中的具体实现(接口实现类)

 

方法区还有 CodeCache:存储即时编译(JIT)后生成的机器码,也属于调优的一部分

 

 

1、永久代:jdk7以前方法区的具体实现,JVM内存模型的堆区(不是操作系统的堆区)

  

2、元空间:jdk8及以后方法区的具体实现,在操作系统的堆区(OS Memory、Native Memory)

大小是多少:MetaspaceSize   MaxMetespaceSize

java -XX:PrintFlagFinal -version | grep Metaspace

2.1、JVM调优参数三种类型:

-XX:key=val

-XX:+/-param

-Xmx -Xms     调优堆的 (eg:-Xmx10m -Xms10m         设置10m)

 

OOM

  eg:模拟元空间OOM的程序: 利用CGLib库,

 

3、如何调优:

-XX:MetaspaceSize=20m 

-XX:MaxMetespaceSize=20m

3.1、元空间的调优规则

3.1.1、最大、最小设置成一样大 防止内存抖动 带来了内存忽大忽小

3.1.2、至少预留20%的空间(为了安全)

 

 

VisualVM是如何监控其他Java程序吗?  java agent(java调试器的底层实现原理)   本地用

arthas 黑窗口,线上用 阿里的

 

二、

本地方法栈:java程序调用c、c++写的动态链接库运行时需要的栈

JNI  目前只有底层会使用:Android需要操作硬件

 

socket 现在都是socket, 兼容性好, java写的服务端,c、c++、Python、go写的客户端, 网络,Linux

 

计算机语言是虚拟的,为什么能操控硬件:电流图、编程图   eg:点亮LED灯等。用0、1控制

 

 

 

问题:

1、一个jvm中有几个虚拟机栈:一个线成一个

  TLAB 堆, 是线成私有堆(新生代)

  PLAB 线程私有堆(老年代)

 

2、一个虚拟机栈有几个栈帧? 方法的调用次数

 

三、

虚拟机栈

栈帧:局部变量表、操作数栈、动态链接、返回地址

 

1、动态链接:java的类方法对象的C++对象再方法区的内存地址

Java的类方法在JVM中是如何存储的

2、返回地址(add方法);存储的是调用方的程序计数器    存储的是main方法的程序计数器

  程序计数器:如果是操作系统级别,那就是寄存器EIP(32bit)、RIP(64bit)    如果是JVM,字节码指令的index