JVM图解
文解(来源于百度百科)
-
定义:JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
-
Java虚拟机有自己完善的硬件架构,如处理器、堆栈等,还具有相应的指令系统。
Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。
Java虚拟机不仅是一种跨平台的软件,而且是一种新的网络计算平台。该平台包括许多相关的技术,如符合开放接口标准的各种API、优化技术等。Java技术使同一种应用可以运行在不同的平台上。Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库。
与JVM有关的问题
- JVM的位置
2.JVM体系结构
- 双亲委派机制
- 类的实例化过程
具体图解
- 双亲委派机制图解(此处参考了IT烂笔头的博客)
-
常见的类加载器(此处引用了IT烂笔头的博客)
Java是运行在Java的虚拟机(JVM)中的,但是它是如何运行在JVM中了呢?我们在IDE中编写的Java源代码被编译器编译成.class的字节码文件。然后由我们得ClassLoader负责将这些class文件给加载到JVM中去执行。
JVM中提供了三层的ClassLoader:
Bootstrap classLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。用c++编写的,该加载器无法直接获取
ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展的jar。
AppClassLoader:主要负责加载应用程序的主函数类
- 沙箱安全机制
- 基础知识
- Native,方法区,
- 栈
- 堆
- 细分
内存转换:1G=1024M 1M=1024K 1K=1024字节 1字节=8位
代码分析运行时堆内存内部的情况
public class runtimememory {
public static void main(String[] args) {
long t1=Runtime.getRuntime().maxMemory();
long t2=Runtime.getRuntime().totalMemory();
long t3=Runtime.getRuntime().freeMemory();
//-Xms1024m(对应totalmemory) -Xmx1024m(对应maxmemory) -XX:+PrintGCDetails 这是我调的参数
System.out.println("运行时jvm尝试申请的最大内存"+t1/1024/1024+"MB");
System.out.println("运行时jvm初始化的最大内存"+t2/1024/1024+"MB");
System.out.println("运行时jvm 剩余的内存"+t3/1024/1024+"MB");
//totalmemory是动态的,如果不设定初始值的话
}
}
运行结果
运行时jvm尝试申请的最大内存981MB
运行时jvm初始化的最大内存981MB
运行时jvm free掉的最大内存966MB
调参面板
常见调参命令
// -Xms 设置初始化内存分配大小
//-Xmx 设置最大分配内存
// -XX:+PrintGCDetail 打印GC信息
//-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError
生成DUMP文件,用于故障分析
OOM故障排除
————————————————
版权声明:本文为优快云博主「IT烂笔头」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/codeyanbao/article/details/82875064