课堂网站开发,邵东网站,石家庄企业网站开发,网站设计作业1.JVM内存结构
1. 方法区#xff08;Method Area#xff09;
方法区是JVM内存结构的一部分#xff0c;用于存放类的相关信息#xff0c;包括#xff1a;
类的结构#xff08;字段、方法、常量池等#xff09;。字段和方法的描述#xff0c;如名称、类型、访问修饰符…1.JVM内存结构
1. 方法区Method Area
方法区是JVM内存结构的一部分用于存放类的相关信息包括
类的结构字段、方法、常量池等。字段和方法的描述如名称、类型、访问修饰符等。静态变量。Java虚拟机在运行时加载的类的信息。
方法区通常在堆区的外部与堆区是分开的。因为主要存放的是类的信息和静态数据所以这一部分数据的生命周期与类本身相同。
2. 堆Heap
堆是JVM中用于动态分配内存的区域是对象和数组的存储区。堆内存是JVM运行过程中最大的内存区域所有对象实例和数组都是在这个区域中分配的。堆区又可以分为几个部分
新生代Young Generation用于存放新创建的对象年轻代又可以分为三个部分Eden空间和两个Survivor空间。新创建的对象首先在Eden区分配经过垃圾回收后存活下来的对象会被移动到Survivor区。老年代Old Generation用于存放长期存活的对象。经过多次垃圾回收仍然存活的对象会被转移到老年代。持久代PermGen/元空间Metaspace在旧版本的JVM中方法区使用持久代来存储类元信息。在Java 8及其之后的版本中持久代被元空间替代主要用于存储类的元数据不再属于Java虚拟机的堆内存而是使用本地内存。
3. 虚拟机栈VM Stack
虚拟机栈用于存储局部变量、操作数栈、动态链接等信息。每个线程都有自己的虚拟机栈。栈是先进后出LIFO的结构栈中的每一个栈帧Stack Frame对应一个方法的调用。在方法调用时相关的局部变量、参数值以及方法返回地址等都会被推入栈中而在方法返回时栈帧会被弹出。
4. 本地方法栈Native Method Stack
本地方法栈用于支持JVM调用本地Native方法类似于虚拟机栈。它存储的是本地方法的栈帧。不同的JVM实现可能会有所不同但其功能主要是协助执行 Java 与其他语言如C、C交互的本地方法。
5. 程序计数器Program Counter Register
程序计数器是一个较小的内存区域保存着当前线程所执行的字节码的地址。它是线程私有的每个线程都有一个程序计数器以便在多线程环境中跟踪每个线程的执行点。可以理解为一个指针指向当前正在执行的指令。
2.垃圾回收机制GC
垃圾回收算法
垃圾回收算法有多种常见的有 标记-清除Mark-and-Sweep 该算法分为两个阶段。第一阶段“标记”会遍历所有可达对象并标记它们第二阶段“清除”会删除没有被标记的对象。尽管这个方法简单有效但它可能导致内存碎片。 复制Copying 该算法将内存分为两个空间通常称为“From”和“To”区域在进行垃圾回收时复制所有活跃对象到另一个区域。复制后原来的区域会被清空。该方法避免了内存碎片但需要更多内存。 标记-整理Mark-and-Compact 该算法与标记-清除结合。首先它会标记所有可达对象然后将它们移动到一端以消除内存碎片并清理未使用的内存。 分代收集Generational Collection 根据对象的生命周期将内存分为若干代通常为年轻代和老年代。新创建的对象通常会在年轻代中变化较快因此通过频繁回收年轻代来提高效率。而老年代中的对象较少变化因此不需要频繁检查和回收。
JVM的垃圾回收机制GC是Java提供的对于内存自动回收的机制。
GCGarbage Collection是Java虚拟机JVM中的一项重要功能用于自动管理堆内存中不再使用的对象释放其占用的内存空间。GC通过标记和回收无效对象来实现内存的回收和释放以避免内存泄漏和溢出。 下面是GC的主要工作原理和过程 1、对象的标记GC首先标记出所有活动对象即仍然被引用或可达的对象。它从一组根对象开始逐步遍历对象图将可达的对象标记为活动对象未标记的对象则被认为是无效的。 2、垃圾回收在标记完成后GC会对未标记的对象进行回收。具体的回收算法可以是不同的常见的算法包括标记-复制算法、三色标记算法等。 3、内存压缩和整理某些垃圾回收算法在回收完对象后可能会产生内存碎片。为了优化内存使用GC可能会进行内存压缩和整理操作使得分配的对象在内存中连续存放减少内存碎片的影响。 GC的优点是可以自动管理内存减少了手动内存管理的复杂性避免了内存泄漏和溢出的问题。但是GC也会带来一定的性能开销。因此在开发Java应用程序时需要合理配置GC的参数和调整垃圾回收策略以平衡性能和内存的使用。
3.JVM调优的方法
1. 内存管理调优 堆内存大小设置可以通过 初始堆大小和 最大堆大小参数来设置堆内存的大小。例如。根据应用程序的需求来调整堆的大小 选择合适的垃圾回收器不同的垃圾回收器适用于不同的场景例如 G1垃圾回收器适合大堆内存和低延迟的应用。Parallel垃圾回收器适合高吞吐量的应用。CMS垃圾回收器适合需要最小停顿的应用。ZGC和Shenandoah适合需要极低延迟的应用但需要JVM版本支持。 调整新生代和老年代的比例可以通过 或 参数来调整新生代与老年代的比例以优化对象的存活率和垃圾回收频率。
2. 垃圾回收调优 影响GC频率和停顿时间的参数 MaxGCPauseMillis设置最大GC停顿时间。GC会尝试满足这个时间限制。GCTimeRatio调整应用可用时间与GC时间的比例。 监控和分析使用JVM提供的工具如JVisualVM、JConsole、GC日志来监控和分析垃圾回收的情况识别GC问题。
3. JIT编译优化 开启Tiered Compilation使用可以提高启动性能。 调整JIT编译行为通过设置编译阈值以控制何时将方法编译为机器代码。-
4. 线程调优 线程栈大小可以用参数设置每个线程的栈大小。例如。适当调整以减少栈溢出和内存使用。 线程池管理如果应用使用线程池确保合理配置线程数避免因过多线程上下文切换引起的性能问题。
5. 其他优化选项 类加载与内存优化 使用 可保持对象引用的压缩有助于减少堆内存的使用。 禁用或调整assertions在生产环境中可以禁用不必要的断言以提高性能。-da
6. 性能监控与分析 使用JVM监控工具如Java Mission ControlJMC和Flight Recorder来分析应用性能查找瓶颈。 Profiling使用工具如YourKit、VisualVM等进行代码剖析找到性能开销较大的热点代码。
7. 配置文件与启动参数
合理配置启动参数根据具体的应用场景和服务器配置调整JVM的启动参数比如开启JIT、选择合适的GC、调整堆内存大小等。
4.堆和栈的区别 1. 结构和用途 栈Stack 栈是一种先进后出LIFO Last In First Out的数据结构。用于存储局部变量、函数参数和函数调用信息等。在函数调用时函数的局部变量会压入栈中函数返回时会将这些变量从栈中弹出。每个线程都有自己的栈用于跟踪函数调用和局部变量。 堆Heap 堆是一种基于动态存储分配的内存区域没有特定的结构可以认为是自由存储区。用于存储动态分配的对象和数据如使用 关键字在C中分配的对象或在Java中创建的对象。堆内存可以由程序员直接管理程序员需要手动申请和释放内存或者由垃圾回收机制如Java、C#自动管理。
2. 存储管理 栈 存储在栈内存中的数据管理简单入栈和出栈操作的时间复杂度都是O(1)。由于栈的大小是固定的通常由操作系统限定栈溢出Stack Overflow可能导致程序崩溃。 堆 堆内存的大小通常只受到系统内存的限制算法的复杂性和速度依赖于内存分配和回收的实现。堆内存分配需要更多的时间且容易出现内存泄漏或内存碎片问题。
3. 生命周期 栈 数据的生命周期由函数调用决定。函数结束后栈上的数据会自动释放。 堆 数据的生命周期由程序员控制只有在不再需要对象时才能显式地释放空间。如果没有释放则会造成内存泄漏。
4. 访问速度 栈 由于其结构简单内存访问速度较快通常会比堆更快。 堆 由于堆内存的管理要复杂得多非顺序访问可能导致较慢的访问速度。
5.JVM使用命令
jvm 的一些命令_jvm命令-CSDN博客
jinfo 描述输出给定 java 进程所有的配置信息。包括 java 系统属性和 jvm 命令行标记等。 jstat jstat -gcutil pid interval 查看java进程的gc情况 以百分比显示每个区域的内存使用情况 参数interval表示每多少毫秒刷新一次 6.class.forName和Classload的区别
1.相同点 两者都可以对类进行加载。 对于任意一个类/对象我们都能够通过反射能够调用这个类的所有属性方法。
2.不同点 抽象类ClassLoader中实现的方法loadClassloadClass只是加载不会解析更不会初始化所反射的类。常用于做懒加载提高加载速度使用的时候再通过.newInstance()真正去初始化类。
7.谈谈JDK1.8特性有哪些
Lambda表达式 类似于ES6中的箭头函数 接口的默认方法和静态方法 新增方法引用格式 新增Stream类 新的日期APIDatetime更方便对日期的操作 引入Optional在SpringData中使用较多然后再通过get获取值主要用于防止NPE。 支持Base64 注解相关的改变 支持并行parallel数组 对并发类Concurrency的扩展。 JavaFX。
JDK1.8常用新特性_jdk1.8的新特性-CSDN博客
8.反射获取类中的所有方法和获取类中的所有属性
getDeclaredMethods() 和 getDeclaredFields() 允许你访问类的所有方法和字段包括私有的。getMethods() 和 getFields() 只返回公共方法和字段且包括继承的父类方法和字段。
9.懒汉和饿汉模式的区别口述两种模式。
在饿汉式单例模式中“饿” 体现的是一种急切的状态。就好像一个很饿的人在看到食物这里类比于单例对象的时候会迫不及待地先把食物拿到手创建单例对象。在这个模式下单例对象在类加载阶段就被创建出来而不是等到真正需要使用这个对象的时候才去创建。这种方式比较急切所以被称为 “饿汉模式”。 在懒汉模式下实例在第一次使用时才进行创建因此称为“懒汉”在需要被用的时候被创建突出一个字“懒”
10.如何保证单例模式在多线程中的线程安全
私有构造函数通过将构造函数设置为私有我们禁止了外部类直接实例化Singleton类。这确保了只能通过getInstance()方法来获取实例。
volatile关键字volatile关键字确保了instance变量的可见性。当一个线程修改了一个volatile变量的值时其他线程能够立即看到这个变化。这样可以避免线程之间的缓存不一致问题。
双重检查锁定Double-Checked Locking为了减少同步开销我们在第一次检查instance是否为空后才进入同步块。这是因为大多数情况下实例已经被创建不需要进入同步块。只有在第一次创建实例时才会需要同步。
同步块在同步块内部我们再次检查instance是否为空以确保只有一个线程能够创建实例。这是为了防止多个线程同时通过了第一个空检查并尝试创建多个实例。
11.spring运用了什么设计模式讲一下哪些部分运用到了这些设计模式
一、简单工厂模式Simple Factory 定义 简单工厂模式并不属于 GoF四人组总结的 23 种设计模式但它却在实际开发中被频繁使用。其核心是 由一个工厂类根据传入的参数动态决定创建哪一个产品类的实例。 举例 Spring 中的 BeanFactory 就是简单工厂模式的体现根据传入一个唯一的标识来获得 Bean 对象。但是在传入参数后创建 Bean 还是传入参数前创建 Bean这个要根据具体情况而定。 二、工厂方法模式Factory Method 定义 工厂方法模式定义了一个用于创建对象的接口让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。 举例 Spring 使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 Bean 对象。两者对比如下 BeanFactory延迟注入使用到某个 Bean 的时候才会注入相比于 ApplicationContext 来说会占用更少的内存程序启动速度更快。 ApplicationContext容器启动的时候不管你用没用到一次性创建所有 Bean。BeanFactory 仅提供了最基本的依赖注入支持ApplicationContext 扩展了 BeanFactory除了有 BeanFactory 的功能还有额外更多功能所以一般开发人员使用 AplicationContext 更多。 三、单例模式Singleton 定义 单例模式确保某一个类只有一个实例而且自行实例化并向整个系统提供这个实例。 举例 在我们系统中有一些对象其实我们只需要一个比如说线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象。事实上这一类对象只能有一个实例如果制造出多个实例就可能会导致一些问题的产生比如程序的行为异常、资源使用过量、或者不一致性的结果。 四、适配器模式Adapter 定义 适配器模式将一个接口转换成客户希望的另一个接口适配器使接口不兼容的那些类可以一起工作。 举例 Spring AOP 中的适配器模式 我们知道 Spring AOP 的实现是基于代理模式但是 Spring AOP 的增强或通知Advice使用到了适配器模式与之相关的接口是 AdvicorAdapter。 五、代理模式Proxy 定义 代理模式为其他对象提供一个代理以控制对这个对象的访问。 举例 代理模式在 AOP 中的应用 AOPAspect-Oriented Programming面向切面编程能够将那些与业务无关却为业务模块所共同调用的逻辑或责任例如事务处理、日志管理、权限控制等封装起来便于减少系统的重复代码降低模块间的耦合度并有利于未来的可扩展性和可维护性 七、观察者模式Observer 定义 观察者模式定义对象间的一种一对多的依赖关系当一个对象的状态发生改变时所有依赖它的对象都得到通知并被自动更新。 举例 Spring 事件驱动模型就是观察者模式很经典的一个应用。Spring 事件驱动模型非常有用在很多场景都可以解耦我们的代码。比如我们每次添加商品的时候都需要重新更新商品索引这个时候就可以利用观察者模式来解决这个问题 八、策略模式Strategy 定义 策略模式定义了一系列的算法并将每一个算法封装起来使它们可以互相替换。策略模式让算法独立于使用它的客户。 举例 Spring 框架的资源访问 Resource 接口。该接口提供了更强的资源访问能力Spring 框架本身大量使用了 Resource 接口来访问底层资源。 九、模板方法模式Template Method 定义 模板方法模式在一个方法中定义了一个算法的骨架而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 举例 Spring 中 JdbcTemplate、HibernateTemplate 等以 Template 结尾的对接入内容进行操作的类它们就使用到了模板方法。一般情况下我们都是使用继承的方法来实现模板模式但是 Spring 并没有使用这种方式而是使用 Callback 模板与模板方法模式配合既达到了代码复用的效果同时增加了灵活性。
12.说说你都知道哪些设计模式最常用的有哪些总共有几种设计模式
23种设计模式 - 知乎
13.redis可以储存哪几种数据类型?你的项目里都用redis存储哪些数据 14.redis有哪些常用操作命令 15.redis缓存和数据库怎么保持一致 16.redis可以持久化么如何持久化
17.redis分布式锁怎么使用
18.redis缓存数据丢失怎么使用
19.redis如果崩溃了如何快速恢复
20.redis是如何部署的是单个部署还是集群部署为什么这么做
21.什么是缓存穿透、缓存击穿、缓存雪崩如何解决
22.List和set和map的区别
23.arrarylistlinkedlistarraylist内部扩容机制是怎样的
24.hashmap扩容机制HashMap的底层原理
25.hashmap的底层用什么储存的线程是否安全
26.final和finally和finalize的区别
27.String、StringgBuilder、StringBuffer的区别
28.重写equals已经能比较两个对象了为什么还要重写hashcode方法
29.基本数据和包装数据类型的区别
30.什么是多态举个例子
31.抽象类和接口的区别
抽象类是半抽象的有构造方法抽象类可以包含抽象方法和非抽象方法也可以有成员变量不仅仅是常量 类和类之间只能单继承一个抽象类只能继承一个类单继承
接口是完全抽象的没有构造方法接口和接口之间支持多继承一个类可以同时实现多个接口 这在Java 8之前基本正确但在Java 8及之后接口可以包含默认方法和静态方法 32.java中的几种基本类型各占用多少字节 33.运行时异常有哪些
34.对面向对象的理解面向对象有的特征有哪些
35.HTTP报文有哪几部分组成Get/Post有什么区别
36.转发forward和重定向redirect的区别
37.什么是AOP什么是IOC
38.AOP用到什么设计模式
39.SpringBean的生命周期
40.SpringIOC是怎么实现了依赖注入有几种依赖注入方式
41.SpringMVC的执行流程
42.SpringMVC与springboot的区别
43.SpringMVC的事物有过哪几种怎么处理的
44.SpringBoot在初始化以前执行一个方法应该怎么做初始化以后在执行一个方法应该怎么做有哪几种方法去做
45.在项目中会经常用到哪些注解讲出十个
46.Autowired注入和自己new一个对象有什么区别
47.myBaties防sql注入的操作
48.Mybaties都要用到哪些标签
49.#和$的区别
#原样输出
$占位符
50.Mybaties如何实现循环
51.Component,Controller,Repository,Service有何区别
52.SpringBoot中的注解SpringBoot的核心注解是什么
53.springBoot要发布一个接口需要几个注解
54.SpringBoot的运行原理/启动流程
55.SpringBoot项目启动类上有什么注解除了常用的还有什么注解
56.SpringBoot配置文件怎么配
57.SpringBoot怎么整合MyBatis
58.SpringBoot项目启动时配置文件加载顺序
59.事物的隔离级别
60.事物的七种传播方式
61.过滤器和拦截器的区别
62.Spring运用了什么设计模式讲一下哪些部分用到了这些设计模式
63.去重SQL语句怎么写
64.MYSQL大批量数据如何导入
65.mysql如何做大数据量分页
66.mysql索引类型
67.怎么避免索引失效
68.了解过MySQL数据库储存引擎么
69.讲讲mysql最左匹配原则
70.笛卡尔积是什么
71.脏读、幻读、不可重复读
72.数据库的优化方案?一个SQL语句如何让他搜索变快?你们遇到的数据量最大的表是什么样有多少条数据。
73.慢日志怎么使用?MYSQL怎么发现动作速度慢的SQL语句?
74.分库分表是怎么做的?数据库分表分库后怎么保证其一致性?
75.MySQL表为何产生死锁?如何避免死锁?
76.oracle与mysql的区别?mysql分页和oracle分页的区别?
77.Mysql默认的事务隔离级别?
78.Mysql的索引的数据结构?
79.Mysql中count()和count(1)区别
80.Sql看执行计划?
81.创建线程的方式及其区别
82.mysq1锁的粒度?并发编程锁到行还是表?(介绍页级、表级、行级)
83.什么是线程和进程?它们之间的区别是什么?
84.请解释一下线程的几种状态以及状态之间的转换关系
85.什么是线程上下文切换?
86.项目中是否用到过多线程?怎么用的?
87.Sleep()和wait()区别?Start()和run()区别?waitsleep, notify的区别?
88.线程安全指的是什么?如何保障线程安全
89.线程锁有几种方式?使用的关键字?
90.什么是乐观锁和悲观锁?
91.synchronized和]ock的区别。Synchronize关键字修饰方法和修饰代码块的区别
92.如何保证单例模式在多线程中的线程安全性
93.线程池的常见类型石那些?
94.线程池中线程的停止?
95.线程池中的线程数多少合适?
96.线程池一般是自动创建的还是手动?为什么?
97.ReentrantLock和synchronized的别是什么
98.什么是死锁?如何避免死锁?
99.Java 中线程间通信有哪些方式