首页 > 编程语言 >【java面经thinking】一

【java面经thinking】一

时间:2024-10-13 21:46:37浏览次数:8  
标签:java thinking 引用 面经 内存 JVM 方法 class 加载

目录

类加载过程

加载:

连接

初始化

GC回收机制(垃圾回收)

区域

判断对象是否存活

回收机制

HashMap

类加载器

加载标识

加载机制

缓存

自定义加载器:

JVM内存结构

常量池

string设置成final

按下网址发生

类加载过程

分为加载,连接和初始化的过程。

加载:

将.class文件的二进制字节流读入内存(jdk1.7之前是JVM内存,jdk1.8及之后为本地内存),并在内存中创建class对象

方法区分配内存问题:太小,OOM问题;太大,影响性能,内存泄露问题。

连接

验证,准备,解析

验证:保证字节流符合JVM规范,例如,检查类是否继承了final修饰的类,例如检查符号权限是否符合语法规定

准备:为类变量开辟空间并赋予默认值

基本类型(int)等的默认值为0;

引用类型默认为null;

解析:将class常量池中的符号引用转为直接引用

符号引用好比如test()方法,直接引用是偏移量例如地址0x123456

初始化

类的变量赋值

GC回收机制(垃圾回收)

对JVM内存进行标记,确定哪块内存会被回收。

区域

堆内存,方法区(jdk1.7以前),1.8以后改为元数据区

其它和线程共存亡

判断对象是否存活

引用计数法(为0可回收)

可达性分析法:GCroots对象到对象是否有引用链,finalize()方法可以拯救对象一次

GCroots:虚拟机栈,方法区类静态引用的对象,本地方法栈引用的对象

回收机制

标记清除法:标记就清除,会产生很多内存碎片,再次触发GC

标记整理法:标记清除后,将内存碎片连续。

复制算法:AB两块内存,先用再用

分代收集算法:年轻---复制算法,老年代---标记清除或者整理法

感觉像年轻和老人之间的缓冲区

HashMap

Map接口实现,就是字典嘛

遍历:

null对比

线程不安全:

jdk1.8以前

jdk1.8

hash冲突

内存泄露

无用的对象一直占内存,没有重写equels和hashcode方法,HashMap发现每次放进来的key的hash都不一样,然后就会不停地往集合里放新数据

类加载器

引导类加载器bootstrap:c语言实现,加载到的路径可以由System.getProperty(“sun.boot.class.path”)查看。

扩展类加载器extend:具体加载路径可通过System.getProperty(“java.ext.dir”)。

系统类加载器system:System.getProperty(“java.class.path”)查看加载路径

加载标识

判断一个类是否被加载的标识是:类全限定名+类加载器,例如pg包下的Person类被CL1类加载器加载到内存,唯一标识为(Person, pg, CL1)

加载机制

全盘负责:该类引用的类全都使用一个加载器加载,避免重复加载

双亲委派(父类委托):递归到顶级父类加载器加载, 将.class文件载入内存的过程由双亲委派机制完成的。
优点:避免多次加载类

安全,防止篡改API,核心API由引导类加载器加载

缓存

当jvm加载完成一个类是会将类放入jvm缓存中,加载流程为先去缓存区查看当前类是否被加载,如果没有则读.class文件并加载,如果加载则直接返回

自定义加载器:

如果打破双亲委派模型,那么你需要重写loadClass方法

JVM内存结构

在运行时数据区

程序计数器PCR:指向下一条将要执行的指令的地址。即线程执行流程是由 字节码解释器 来改变程序计数器的值来维持的。不存在内存溢出的。

堆:

栈:虚拟机栈是为我们的Java方法服务的,而本地方法栈则是为native方法服务的,二者功能基本相似,而我们平时所说的栈就是虚拟机栈。

嵌套调用类的执行过程可以看作栈。

方法区:为类被编译的数据加载到内存后的存储位置

在JDK1.7时,将字符串常量池与静态变量转移到了堆内存,在JDK1.8时取消了方法区,用元空间取代了方法区,元空间位于物理内存

常量池

string设置成final

按下网址发生

标签:java,thinking,引用,面经,内存,JVM,方法,class,加载
From: https://blog.csdn.net/m0_73629042/article/details/142905182

相关文章

  • Java语言中1.方法调用栈 2.栈帧 3.局部变量表 4.操作数栈 5.动态链接 6.方法的入参存
    在Java语言中,理解方法调用栈、栈帧、局部变量表、操作数栈等概念非常重要,它们与方法的执行和内存管理密切相关。下面是对这些概念的详细解释及它们之间的关系:1.方法调用栈(MethodCallStack)方法调用栈是每个线程维护的一块内存区域,用于存储线程执行时的栈帧(每个栈帧对应一次......
  • java项目--零钱通(OOP)
    参考上一篇,项目在主方法中运行的弊端,不易修改,也不能随用随调,结合面向对象的优势,因此有了以下代码的实现:分两个部分,一个类是完成零钱通的各个功能,另一个类用于调用该类的方法。代码如下(功能类展示):/*该类是完成零钱通的各个功能的类*/publicclassOOP{booleanloop......
  • java实现--零钱通
    项目说明:参照微信小程序的零钱通,可以完成收益入账,消费,查看明细,退出系统等功能。以下是功能模块的具体代码:importjava.text.SimpleDateFormat;importjava.util.Scanner;importjava.util.Date;publicclassfirst{publicstaticvoidmain(String[]args){......
  • Java 和 Python 的终极对决:毕业设计选谁才不掉头发?
    前言:老铁们,毕业设计来了,你准备好了么?听说最近有不少同学陷入了毕业设计选择恐慌,尤其是你手边摆着两把编程界的“大宝剑”:Java和Python,不知选哪把能少掉几根头发,甚至怀疑自己还能不能顺利毕业?其实,这个问题很简单,就好像你在超市里面对两袋薯片——“哎,这袋多一点,那袋口味更好,真......
  • java中有非可重入锁吗?
    Java中没有直接提供非可重入锁的实现,但可以通过一些手段来模拟非可重入锁的行为。首先,需要明确可重入锁和非可重入锁的概念。可重入锁允许同一个线程在持有锁的情况下再次获取该锁,而不会发生死锁。这通常是通过维护一个锁持有者的计数器和线程ID来实现的,当同一个线程再次......
  • 从本我出发,窥视java面向对象之本源
    掀开面向对象的神秘面纱,我们到底该如何深入理解java的面向对象?1.故事从一个小场景开始:是夜,月黑风高,你单枪匹马独自一人来到幽暗森林,想要去窥探java那神秘而充满好奇的世界。突然,眼前一个黑影一闪而过,你顿时血压飙到250,一句“卧槽”脱口而出,心里害怕极了。“刚刚那玩意到......
  • Educoder——JAVA高级特性 字节流-输入输出
    任务描述本关任务:使用输入输出流读写文件。相关知识为了完成本关任务,你需要掌握:1.如何使用输入流;2.如何使用输出流。输入流我们通过一个示例,来看看输入流应该如何使用,首先我们在D盘下创建一个hello.txt文件。输入文本HelloJavaHelloInputStream。在main方法中加入如......
  • 2024Java最新面试题总结(针对于一些小厂、中厂)
    这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。面试的时候,会先让你进行自我介绍,这个大家准备一两分钟的面试稿就可以。然后就是正式面试,面试官一般是两个人以上,开始,面试官会先提问一些基本知识,很基础,基本这个大家是没什么问题的,都可以回答应对。最重要的......
  • Java JWT:原理、机制及案例示范
    一、什么是JWT?1.1JWT的基本概念JWT(JSONWebToken)是一种用于在各方之间传递JSON格式信息的紧凑、URL安全的令牌(Token)。JWT的主要作用是验证用户身份或权限。它由三部分组成:Header(头部):标识令牌的类型和加密算法。Payload(载荷):包含了实际的身份信息及其他数据。Signature(签......
  • 高校宿舍管理系统的设计与实现(Java+ssm+万字文档+系统源码+数据库 +调试)
    摘 要本文是对高校宿舍管理系统的概括总结,主要从开题背景,课题意义,研究内容,开发环境与技术,系统分析,系统设计,系统实现这几个角度来进行本高校宿舍管理系统的阐述。高校宿舍管理系统运用Eclipse工具进行开发,使用Java语言进行编码,后台框架采用SSM框架(Spring框架、SpringMVC框......