• ==欢迎来访我的个人博客== :Mosey

jre jdk jvm三者区别

  • Jdk是Java 开发工具包,jdk文件夹下面的bin目录有提供一些工具程序,比如:java.exejavac.exejavadoc.exe等等
  • Jre是java运行时环境
  • Jvm是java虚拟机
  • Jdk包含Jre,Jre包含Jvm

.java后缀文件运行

  • 1.javac xxx.java命令把.java文件编译成.class字节码文件
  • 2.java xxx命令把字节码文件放到Jvm中执行代码程序

java跨平台性

JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。编译虚拟机的指令集与编译微处理器的指令集非常类似。
JVM是Java语言跨平台(这里的“平台”是指不同的操作系统)的基础,要想在不同的操作系统上运行Java程序,就需要在不同操作系统上安装对应的JVM。所以,JVM有Windows版本、MAC版本、Linux版本等。

jvm一些理解

  • -Xmx(最大堆内存)-Xms(最小堆内存)这两个jvm调优参数,是对堆进行控制的,如果内存不足,就报OutOfMemoryError:java heap space异常
  • 堆和方法区是共享的,
  • jps命令查看当前用户的Java进程,非系统中所有的进程。

队列和栈的区别

  • 队列的插入叫入队,队列的删除叫出队。栈的插入叫进栈,栈的删除叫出栈。
  • 队列在队尾入队,队头出队,即两边都可操作。而栈的进栈和出栈都是在栈顶进行的,无法对栈底直接进行操作。
  • 队列是先进先出,栈为先进后出

双亲委派机制

  • 理解:在类加载的时候,类加载器要加载编译后的.class文件,这时,类编译器会首先向上级类加载器请求访问有没有加载过,有加载过就不用自己加载,如果都没有找到,就会报ClassNotFoundException
  • 好处:保证类不被轻易纂改,数据安全
  • 各个类加载器级别:从小到大
    • 1、BootStrap ClassLoader:rt.jar
    • 2、Extension ClassLoader: 加载扩展的jar包
    • 3、App ClassLoader:指定的classpath下面的jar包
    • 4、Custom ClassLoader:自定义的类加载器

类加载顺序

加载、连接(验证+准备+解析)、初始化、使用、卸载。

  • 加载:加载.class文件;

  • 验证:检查.class文件是否正确;

  • 准备:给类分配一定的内存空间;

  • 解析:将常量池内的符号引用替换为直接引用;

  • 初始化:执行 static 代码块进行初始化,如果存在父类,先对父类进行初始化;

  • 使用:为对象分配内存空间和初始化;

  • 卸载:GC回收类对象。

判断对象是否存活

  1. 引用计数法
  2. 可达性分析

垃圾回收算法

  • 标记清除、复制算法、标记整理三种算法

GC调优或Jvm调优

  • 一般项目加个 xmsxmx 参数就够了。在没有全面监控、收集性能数据之前,调优就是瞎调。

调优工具

  • 一些JDK自带命令jpsjstatjmapjhat
  • 有兴趣可以去了解一下阿里出品的java诊断调优神器Arthas