首页 > 其他分享 >jvm

jvm

时间:2023-04-13 23:13:45浏览次数:29  
标签:java jvm 线程 内存 JVM GC 加载

1.什么情况下会发生栈内存溢出。

 

 


2.详解JVM内存模型
思路: 给面试官画一下JVM内存模型图,并描述每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。

我的答案:

JVM内存结构

 

 

 

3.JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。


4. JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代

 

 


5.你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

 

 


6.JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存。
思路: 先画出Java内存模型图,结合例子volatile ,说明什么是重排序,内存屏障,最好能给面试官写 以下demo说明。

我的答案:

1)Java内存模型图:

 

Java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中 保存了该线程中是用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步进行。

2)指令重排序。

在这里,先看一段代码

public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { Thread one = new Thread(new Runnable() { public void run() { a = 1; x = b; } });Thread other = new Thread(new Runnable() { public void run() { b = 1; y = a; } }); one.start();other.start(); one.join();other.join(); System.out.println(“(” + x + “,” + y + “)”);}

1
2
运行结果可能为(1,0)、(0,1)或(1,1),也可能是(0,0)。因为,在实际运行时,代码指令可能并不是严格按照代码语句顺序执行的。大多数现代微处理器都会采用将指令乱序执行(out-of-order execution,简称OoOE或OOE)的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱序执行的技术,处理器可以大大提高执行效率。而这就是

指令重排。

 

7.简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。


双亲委派模型图:

 

8.说说你知道的几种主要的JVM参数

 

 


9.怎么打出线程栈信息。


10.强引用、软引用、弱引用、虚引用的区别?

 


11.内存模型以及分区,需要详细到每个区放什么。


12.堆里面的分区:Eden,survival (from+ to),老年代,各自的特点。


13.简述 java 垃圾回收机制?


14.java 中垃圾收集的方法有哪些?

 


15.java 内存模型

 


16.java 类加载过程?

 


17. 简述 java 类加载机制?
虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验,解析和初始化,最终形成可以被虚拟机直接使用的 java 类型。

18. 类加载器双亲委派模型机制?
当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。

19.什么是类加载器,类加载器有哪些?


20.简述 java 内存分配与回收策率以及 Minor GC 和 Major GC
对象优先在堆的 Eden 区分配。
大对象直接进入老年代.
长期存活的对象将直接进入老年代当 Eden 区没有足够的空间进行分配时,虚拟机会执行一次 Minor GC.Minor Gc 通常发生在新生代的 Eden 区,在这个区的对象生存期短,往往发生 Gc 的频率较高,回收速度比较快;Full Gc/Major GC 发生在老年代,一般情况下,触发老年代 GC的时候不会触发 Minor GC,但是通过配置,可以在 Full GC 之前进行一次 Minor GC 这样可以加快老年代的回收速度。
————————————————
版权声明:本文为CSDN博主「Netty711」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Netty711/article/details/126548678

标签:java,jvm,线程,内存,JVM,GC,加载
From: https://www.cnblogs.com/shan13936/p/17316900.html

相关文章

  • JVM:内存结构上
    !点击代码高亮化!jvm内存结构·上程序计数器虚拟机栈(线程私有栈-方法的栈帧\FILO)当前线程的压入的方法的栈帧-Xss"SIZE":设置线程栈大小栈内存溢出SO:StackOverflowErrorat'错误代码处'递归调用有时第三方库也会导致SO:ObjectMapper/@JsonIgnore线程安全方法的......
  • jvm
    java内存模型与分区:本地方法栈:native方法调用本地其他语言接口;程序计数器:记录当前线程的运行位置;栈:存放运行时的方法,包括:局部变量表、操作数栈、动态链接(指向常量池)和方法返回地址。堆:初始化的对象、成员变量。方法区:类型信息(加载类的类型(Class)、类的完整名称、类型修饰符等......
  • JVM 内存
    简述JVM内存模型  从宏观上来说JVM内存区域分为三部分线程共享区域、线程私有区域、直接内存区域。1.1、线程共享区域1.1.1、堆区堆区Heap是JVM中最大的一块内存区域,基本上所有的对象实例都是在堆上分配空间。堆区细分为年轻代和老年代,其中年轻代又分为Eden、S0、S1......
  • 细读JVM日志--01
    七种垃圾收集器具体每一种的详情见以下是垃圾回收日志中的一块:0.150:[GC(System.gc())[PSYoungGen:5161K->931K(74752K)]5161K->939K(245760K),0.0007762secs] [Times:user=0.00sys=0.00,real=0.00secs]0.151:[FullGC(System.gc())[PSYoungGen:931K->0K(74752K)]......
  • JVM基础一
    目录一、JVM基本认识1、虚拟机与JVM2、JVM整体结构Java文件编译过程图JVM结构图JVM分类JVM生命周期简述简单了解几个虚拟机二、类加载子系统(ClassLoaderSubSystem)介绍1、类加载子系统作用、流程作用工作流程2、加载(Loading)3、连接(Linking)——验证(Verification)4、连接(Lin......
  • JVM:并发的可达性分析
    当前主流编程语言的垃圾收集器基本上都是依靠可达性分析算法来判定对象是否存活的,可达性分析算法理论上要求全过程都基于一个能保障一致性的快照中才能够进行分析,这意味着必须全程冻结用户线程的运行。在根节点枚举这个步骤中,由于GCRoots相比起整个Java堆中全部的对象毕竟......
  • JVM 堆内存大小查看
    JVM堆内存大小查看在默认不配置JVM堆内存大小的情况下,JVM根据默认值来配置当前内存大小,可通过如下命令进行查看:java-XX:+PrintFlagsFinal-version|grepHeapSize  上图表示启动的JVM默认最大堆内存约为2.9G,初始化大小为195MB。 ......
  • 通俗解释 JVM CAS 机制
    JVM的CAS,即CompareAndSwap,是一种并发编程中常用的保证原子性的技术。通俗地讲,CAS用于在多线程环境下对共享变量的值进行原子操作,即多个线程同时访问同一个共享变量,但只有一个线程能修改这个变量的值,并且这个操作是原子的,不会被其他线程打断。具体来说,CAS操作包含如下三个......
  • JVM
    什么是JVMjvm是java虚拟机运行在用户态、通过应用程序实现java代码跨平台、与平台无关、实际上是"一次编译,到处执行"从微观来说编译出来的是字节码!去到哪个平台都能用,只要有那个平台的JDK就可以运行!字码好比是一个人,平台好比为国家,JDK好比这个国家的语言!只要这个人(字节码)有了......
  • JVM系统优化实践(14):GC可视化工具
    您好,我是湘王,这是我的51CTO博客,欢迎您来,欢迎您再来~工欲善其事,必先利其器。知道了GC工作原理,学会了看GC日志之后,再来了解一下分析GC的工具。它们分别是jstat、jmap、jhat。jstat顾名思义,主要是用于查看JVM的内存和GC情况。先用jps找出Java进程的PID,再用jstat-gc[PID]查看JVM的内存......