Java快问快答小集锦001-Java程序是如何执行的

1.Java和JDK关系?

JDK(java Development Kit) Java开发工具,它包括:编译器\Java运行环境\JVM(Java虚拟机)监控和诊断工具等等,而Java则是一种开发语言

2.Java程序是如何执行的?

我们日常的工作中都是使用开发工具(IDEA或者Eclipse等等)可以很方便的调试文件或者程序,或者是通过打包软件把项目打包成jar文件或者war文件,放入到Tomcat等Web容器中就可以正常运行了,但是JAVA内部是如何运行的呢?
其实不论是在开发工具中运行还是在Tmocat中运行,Java程序的执行流程基本都是相同的,它的执行流程如下:

  • 先把Java代码编译成为字节码,也就是把.java类型的文件编译成为.class类型的文件.这个过程的大致执行流程:Java源代码–>语法分析器–>语义分析器–>字符码生成器—>最终生成字节码文件,其中的任何一个节点失败了整个编译过程就会失败.
  • 把class文件放置到Java虚拟机中,这个虚拟机通常指的是Oracle官方自带的Hotspot JVM
  • Java虚拟机使用类加载器(class Loader)装载文件;
  • 类加载完成之后,会进行字节码校验,字节码通过之后JVM解释器会把字节码翻译成为机器码交给操作系统执行,但不是所有的代码都是解释执行的,JVM对此做了优化,比如:以Hostpot虚拟机来说,它本身提供了JIT(just in time)也就是我们通常所说的动态编译器,他能够在运行时候将热点代码编译为机器码,这个时候字节码就变成了编译执行.
  • java程序执行流程图如下:
  • 在这里插入图片描述

3.虚拟机时如何判定热点代码的?

Java虚拟机判定热带你代码的方式有两种。

3.1基于采样的热点判断

主要是虚拟机会周期性的检查哥哥线程的斩顶,若某个或者某些方法经常出现在栈顶,那么这个方法就是“热点方法”。这种判定的优点是:实现简单;缺点是很难精准的判定一个方法的热度,容易受到线程阻塞或者外界因素的影响。

3.2基于计数器的热点判断

主要就是需虚拟机给每一个方法甚至每个代码块建立了一个计数器,统计方法的执行次数,超过了一定的阈值则标记为此方法为热点方法。
Hostpot虚拟机使用的基于计数器的热点探测方法,它使用了两类计数器:方法调用计数器和回边计数器,当达到一定的阈值就会触发JIT编译。
方法调用计数器:在client模式下阈值为1500次,Server值为10000次,可以通过虚拟参数:-xx:Compile Threshold=N对其惊醒设置,但是JVM还存在热度衰减,时间段内调用方法的次数比较少,计数器就会减小。
回边计数器:主要统计的是方法中循环代码块执行的次数。

4.Java语言都有哪些特点?

Java语言包含以下特点:

  • 面向对象:程序容易理解、开发简单方便
  • 跨平台,可以运行在不同的服务器类型上,比如:Linux、Windows、Mac等
  • 执行性能好,运行效率高
  • 提供大量的API扩展,语言功能强大
  • 有多线程支持,增加了响应和实时交互的能力
  • 安全性好,自带验证机制,确保程序的可靠性和安全性。

5.Java跨平台实现的原理是什么?

先从Java的执行过程开始说起:
在这里插入图片描述
Java执行流流程:
Java源代码(.java)—>编译---->Java字节码(.class)—>通过JVM虚拟机运行Java程序.每种类型的服务器都会运行一个JVM,Java程序只需要生成JVM可以执行的代码即可,JVM底层屏蔽了不同服务器类型之间的差异,从而可以在不同类型的服务器上运行一套Java程序.

6.JDK\JRE\JVM有哪些区别?

JDK:JAVA Development Kit(Java开发工具包)的简称,提供了Java的开发环境和运行环境
JRE:Java Runtime Environment(Java运行环境)的简称,为Java的运行提供了所需的环境
JVM:Java Virtual Machine(Java虚拟机)的简称,是一种计算设备的规范,它是一个虚构出来的计算机,是通过实际的计算机上仿真模拟各种计算机功能来实现的,简单来说就是所有的Java程序都是运行在JVM(Java虚拟机)上面的

总体来说:JDK提供了U一整套的Java开发和运行环境,通常使用对象为Java的开发者,当然JDK也包含了JRE;而JRE为Java运行的最小运行单元,一般安装在Java服务器上,所以JDK和JRE可以从用途上进行理解和区分.JVM不同与JDK和JRE,JVM是Java程序运行的载体,Java程序只有通过JVM才能正常运行.

7.Java中如何获取明天此刻的方法?

JDK8之前使用的是Calendar.add(_)方法获取,代码如下:

Calendar calendar = Calendar.getInstance();
caldenar.add(Calendar.DATE,1)
System.out.println(Calendar.getTime());

JDK8有两种获取明天时间的方法.
方法一,使用LocalDateTime.plusDays()方法获取,代码如下:

LocalDateTime today = LocalDateTime.now();
LocalDateTime tomorrow = today.plusDay(1);
sout(tomorrow);

方法二:使用LocalDateTime.minusDays()方法获取,代码如下:

LocalDateTime today = LocalDateTime.now();
LocalDateTime  tomorrow = today.minusDay(-1);
sout(tomorrow);

minusDays()方法为当前时间减去n天,传入负值就相当于当前时间加上n天.

8.Java中如何跳出多重嵌套循环?

Java中跳出多重嵌套循环的方式有两种:
方法一:定义一个标号,使用break加上标号的方式跳出循环,代码结构如下:

myfor: for(int i=0;i<100;i++){
 for(int j=0;j<100;j++){
 sout("J"+j);
 if(j==10){
 //跳出多重循环
 break myfor;
	 }
 }
}

方法二:使用全局变量终止循环,代码结构如下:

boolean flag = true;
for: for(int i=0;i<100&&flag;i++){
 for(int j=0;j<100;j++){
 sout("J"+j);
 if(j==10){
 //跳出多重循环
 flag = false;
 break myfor;
	 }
 }
}

9.char变量能不能存储一个中文汉字,为什么?

char变量可以存储中文汉字,因为Java中使用的默认编码是Unicode,一个char类型占用2个字节(16byte),所以存放一个中文是没有问题的.

10.Java中会存在内存泄漏吗?简单描述一下

一个不再被程序使用的对象或者便令一直被占据在内存中就存在内存泄漏.Java中内存泄漏的常见场景如下:
10.1 长生命周期对象持有端生命周期对象的应用,比如,缓存系统,我们加载了一个对象放在缓存中,然后一直不使用这个缓存,由于缓存的对象一直被缓存引用得不到释放,就会造成内存泄漏
10.2 各种连接未调用关闭方法,比如,数据库connection连接,为显性地关闭,就会造成内存泄漏
10.3内部类持有外部类,如果一个外部类的实例对象的方法返回了一个内部类的实例对象,这个内部类对象被长期引用了,即使这个外部类实例对象不再被使用,但是由于内部类持有外部类的实例对象,这个外部类独享不会被垃圾回收,这也会造成内存泄漏
10.4 改变哈希值: 当一个对象被存储进了hashset集合中之后,就不能在修改这个对象中的那些参与计算的哈希值的字段了 ,否则对象修改后的哈希值与最初存储进hashset集合中的哈希值就不同了,在这种情况相爱,及时在contains方法使用该对象的当前引用作为参数去hashset集合中检索对象,也将返回找不到对象的救国,这也会导致无法从hashset集合中删除当前对象,造成内存泄漏.

面试需要梳理的知识点:
1.Java基础中的核心内容
字符串和字符串常量池的升入理解,Array的操作和排序算法、深克隆和浅克隆、各种IO操作、反射和动态代理(JDK代理和CGlib代理)
2.集合
集合和String是变成中最常用的数据类型,关于集合的知识点也是面试备考的内容,它包含:链表(LinkedList)、Treeset、栈Stack、队列(双端、阻塞、非阻塞队列、延迟队列)HashMap、TreeMap等,它们的使用和底层存储数据结构都是面试的热门考点。
3.多线程
多线程的使用和线程安全问题的知识点也是必考的面试题,包括:ThreadLocal、synchronized、Lock、JUC(Java.util.concurrent包)、CAS(compare and Swap)、ABA问题等。
4.热门框架
Spring、Spring MVC、MyBatis、SpringBoot
5.分布式编程
消息队列、RabbitMQ、kafkaf 、Double、Zookeeper、SpringCloud等
6.数据库
MYSQL、Redis
7.Java虚拟机
虚拟机的组成、垃圾回收算法、各种垃圾回收器、Java虚拟机分析工具、Java虚拟机长用调优配置等等。
8.其他
常用算法、设计模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值