java 面试知识点笔记(一)底层知识 jvm相关

Wesley13
• 阅读 595

问:谈谈你对java的理解?

  • 平台无关性(一处编译多处运行)
  • GC(垃圾回收机制)
  • 语言特性(泛型、反射、lambda表达式)
  • 面向对象(封装继承多态)
  • 类库(集合、网络库、并发库、nio)
  • 异常处理

javac 将.java文件进行编译,编译出.class文件(二进制字节码,包含java类中的属性、方法、常量信息,还会有个共有的静态常量属性.class,这class记录了类的相关信息及类型信息,是class的一个实例)

javap 可反编译class文件 可以查看java编译器生成的字节码

java 面试知识点笔记(一)底层知识 jvm相关

如何跨平台的:

java 面试知识点笔记(一)底层知识 jvm相关

问:jvm如何加载.class文件?

java 面试知识点笔记(一)底层知识 jvm相关

问:谈谈反射?写例子?

理论:Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。

实例:java 面试知识点笔记(一)底层知识 jvm相关

ps:getDeclaredMethod 公共的私有的包私有的方法(private、protected、public和default),即所有的都可以,但是不能获取到继承的,实现接口的方法

 私有方法必须设置 .setAccessible(true)

getMethod 可以获取public方法和继承的方法、实现接口的方法

类从编译到执行的过程:

  1. 编译器将Robot.java源文件编译为Robot.class字节码文件
  2. ClassLoader将字节码转换为JVM中的Class对象
  3. JVM利用Class对象实例化为Robot对象

问:谈谈ClassLoader?

理论:ClassLoader在Java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。ClassLoader是Java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入系统,然后交给Java虚拟机进行连接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的连接和初始化行为。

 最核心的就是 ClassLoader.java中的loadClass方法

ClassLoader的种类:

  1. BootStrapClassLoader:C++编写,加载核心库java.*
  2. ExtClassloader:java编写,加载扩展库javax.*(System.getProperty("java.ext.dirs")可以看到扩展库路径)
  3. AppClassLoader:java编写,加载程序所在目录(System.getProperty("java.class.path")可以看到加载路径,最重要的是javabasic路径)
  4. 自定义ClassLoader:java编写,定制化加载(关键函数,findClass、defineClass)

类的加载方式:

  • 隐式加载:new 
  • 显示加载:loadClass、forName等,获取到class对象之后调用newInstance()方法来生成对象实例(newInstance不支持传入参数,需要反射getConstructor然后调用构造器的newInstance方法传入参数)

loadClass和forName的区别:

类的装载过程(加载和生成实例的过程)

java 面试知识点笔记(一)底层知识 jvm相关

  • Class.forName得到的class是已经完成初始化的

  • Classloder.loadClass得到的class是还没有链接的

    public class Robot { static { System.out.println("Hello Robot"); } }

    public static void main(String[] args) throws ClassNotFoundException { //不会初始化 所以没有打印(加快加载速度,延迟加载) ClassLoader cl = Robot.class.getClassLoader(); //会初始化 所以打印了(mysql驱动就是用的这个) Class r = Class.forName("myclassloader.Robot"); }

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java基础知识随身记
2018年11月12日20:51:35一、基础知识:1、JVM、JRE和JDK的区别:JVM(JavaVirtualMachine):java虚拟机,用于保证java的跨平台的特性。  java语言是跨平台,jvm不是跨平台的。JRE(JavaRuntimeEnvironment):java的运行环境,包括jvmjava的核心类
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
3年前
Java程序运行机制及开发环境
Java既是编译型语言,又是解释型语言java源文件首先需要通过javac编译生成后缀名为.class的字节码文件(与平台无关,只面向JVM),然后使用Java虚拟机将字节码解释成特定平台上的机器码运行。Java虚拟机JVM不同平台上的JVM不同,但是都提供了相同的接口。开发Java准备1.下
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这