Java虚拟机
问而知
向Java提问,探寻代码内含的意蕴
展开
-
问一:JAVA平台无关系是如何实现的呢?
JAVA平台无关系是如何实现的呢?JAVA源码首先被编译成字节码(.class文件),然后再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要重新编译,JAVA虚拟机在执行字节码的时候,把字节码转换成具体平台上的机器指令为什么JVM不直接将源码解析成机器码去执行呢?跨平台的特性:其次呢,也减少了运行源代码需要做的一些准备工作,比如每次编译时执行的语法语义检查,通过引...原创 2019-04-16 08:49:48 · 197 阅读 · 0 评论 -
问十二:对象被判断为垃圾的标准是什么?
可以通过以下算法来判断对象是否为垃圾:在java中,实际上是通过第二种方法来判断就会出现内存泄露在JAVA语言中,可作为GC Roots的对象包括下面几种:1、虚拟机栈中引用的对象(栈帧中的本地变量表)2、方法区中类静态属性引用的对象3、方法区中常量引用的对象4、本地方法栈中JNI引用的对象(javanativeinterface)5、活跃线...转载 2019-04-17 22:25:04 · 239 阅读 · 0 评论 -
问十三:如果发现对象不可达,那么它一定会“死”吗?
可达性分析算法中不可达的对象,并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:1、对象在进行可达性分析后被发现不可达,它将会被第一次标记并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法,当对象没有覆盖finalize()方法或者finalize()方法已经被JVM调用过,那么就没必要执行finalize()方法...转载 2019-04-17 22:25:31 · 783 阅读 · 0 评论 -
问十四:谈谈你了解的垃圾回收算法?
附加:在JDK1.7之后,去除了永久代转载 2019-04-17 22:26:11 · 451 阅读 · 0 评论 -
问十五:说说CMS收集器?(翻译自plumbr.io)
CMS收集器(-XX:+UseConcMarkSweepGC 标记-清除算法)概述:CMS,全称Concurrent Mark and Sweep,用于对年老代进行回收,目标是尽量减少应用的暂停时间,减少full gc发生的机率,利用和应用程序线程并发的垃圾回收线程来标记清除年老代CMS并非没有暂停,而是用两次短暂停来替代串行标记整理算法的长暂停。收集周期:1) Ini...翻译 2019-04-17 22:27:35 · 213 阅读 · 0 评论 -
问十六:你了解哪些垃圾收集器呢?
整体结构:1.Serial收集器(-XX:+UseSerialGC 复制算法)1.是一个单线程收集器,只会使用一个CPU或一条收集线程去完成垃圾收集工作2.进行垃圾收集时,必须暂停其他所有的工作线程,直至Serial收集器收集结束为止(“Stop The World”)3.是HotSpot虚拟机运行在Client模式下的默认的新生代收集器4.与其他收集器的单线...原创 2019-04-17 22:28:36 · 515 阅读 · 0 评论 -
问十七:Stop-the-World和Safepoint的特点是什么?
Stop-the-World[GC用]1、JVM由于要执行GC而停止应用程序的执行2、任何一种GC算法中都会发生3、多数GC优化都可以通过减少Stop-the-World发生的时间来提高程序性能,达到高吞吐,低停顿的特点Safepoint[可达性分析用]在可达性算法的可达性分析中,分析对象的引用必须在一个快照点进行,在这个点所有的线程都被冻结。不能出现在分析过程中对象的引...转载 2019-04-17 22:29:12 · 446 阅读 · 0 评论 -
问十八:Minor GC和Full GC的触发条件?
Minor GC和Full GC触发条件1、Minor GC:eden区满时,触发MinorGC(即申请一个对象时,发现eden区不够用,则触发一次MinorGC)注:新生代分为三个区域,eden space, from space, to space。默认比例是8:1:1在MinorGC时,会把存活的对象复制到to space区域,如果to space区域不够,则利用担保机制进入老年...转载 2019-04-17 22:30:18 · 892 阅读 · 2 评论 -
问十九:新生代转换为老年代的四种情况?
首先需要知道Java内存是如何分配的:1.对象优先在新生代的Eden区进行分配2.大对象直接进入老年代3.长期存活的对象将进入到老年代(虚拟机设置值,默认阈值为15)4.动态对象年龄判定,如果Survivor区中相同年龄所有对象的大小总和大于Survivor区空间一半,年龄大于或者等于该年龄的对象在MinorGC时将复制到老年代5.空间分配担保,当MinorGC时,如果存活对象...转载 2019-04-17 22:31:30 · 4323 阅读 · 0 评论 -
问十一:JVM调优常用配置参数有哪些?
例如:-Xms20m -Xmx20m -Xss256kjvm配置XX比X的稳定性更差,并且版本更新不会进行通知和说明。1、-Xms s为strating,表示堆内存起始大小2、-Xmx x为max,表示最大的堆内存(一般来说-Xms和-Xmx的设置为相同大小,因为当heap自动扩容时,会发生内存抖动,影响程序的稳定性)3、-Xmn n为new,...原创 2019-04-17 22:23:27 · 2949 阅读 · 1 评论 -
问十:不同JDK版本之间intern()方法的区别?(JDK6 与JDK6+)
区别:这个会不会是因为StringTable移到这里判断字符串常量池先前是否创建出该字符串对象的方法是:比较字面值(感觉是equal,留个坑,以后补【感觉是对的,直接看JDK API,还是API靠谱准确些,解析放在附1】)返回的是true注:在JDK1.6的时候,字符串常量池是存放在Perm Space中的(Perm Space和堆是相隔而开的),在1.6+的时候,移到了堆内存...原创 2019-04-16 09:00:08 · 380 阅读 · 0 评论 -
问二:你了解JAVA的内存模型(JMM)吗?
原理图: 注:java8中,已经将常量池移动到堆中部件详解:举例:执行add(1,2)Method area is created on virtual machine startup, shared among all Java virtual machine threads and it is lo...原创 2019-04-16 08:51:15 · 165 阅读 · 0 评论 -
问三: JAVA内存模型中堆和栈的区别?
联系:引用对象、数组时,栈里面定义变量保存堆中目标的首地址区别:转载 2019-04-16 08:51:56 · 320 阅读 · 0 评论 -
问四: 怎么快速实现OOM和SOF?
OOMSOF原创 2019-04-16 08:52:53 · 494 阅读 · 0 评论 -
问五:JVM是如何执行.class文件的?
加载->验证->准备->解析->初始化1.加载比如运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“*$Proxy”的代理类的二进制字节流。加载阶段与连接阶段的部分内容(如一部分字节码文件格式验...原创 2019-04-16 08:53:40 · 1652 阅读 · 0 评论 -
问六:ClassLoader有什么用?写一个?
需要了解:回答:手写一个ClassLoaderpackage com.liu.socket;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;impor...转载 2019-04-16 08:55:37 · 880 阅读 · 0 评论 -
问七:谈谈ClassLoader的双亲委派机制?
原理图:代码实现:这段代码的意思是:如果当前类加载器还有父类,就委托父类进行类加载,这个过程一直持续到BootstrapClassLoader这个类中,如果没有则报错。如果某一个父类中有,则加载到内存中,同时findLoadedClass就能够得到加载后的class,直接跳过父类加载器以外的加载器。回答:JDK有三中类加载器:用来加载核心类库的引导类加载器(BootStra...原创 2019-04-16 08:56:04 · 511 阅读 · 0 评论 -
问八:说说loadClass和forName的区别?
源代码解析:ClassLoader.loadClass首先是ClassLoader的loadClass(String class_name, boolean resolve)方法,传入了一个resolve的boolean类型如果为true,则执行resolveClass方法,这个方法的作用是即链接指定class,但是实际上在调用这个方法之前,就已经传入了它的默认值...原创 2019-04-16 08:56:33 · 453 阅读 · 0 评论 -
问九:元空间(MetaSpace)与永久代(PermGen)的区别是什么?
两者介绍:在JDK1.8之后,开始将类的元数据Meta信息放到本地堆内存中,这部分内存就称为元空间,这在JDK1.7及以前是属于永久代的,但是在JDK1.8之后,元空间就取代了永久代它们两个都是用来存储class的相关信息的,比如class的method和field等它们两个都是方法区的实现,只是实现不同,所以说方法区只是JVM的一种规范元空间(MetaSpace)没有了字符串常量...转载 2019-04-16 08:58:05 · 682 阅读 · 0 评论 -
问二十:JAVA中的强引用,软引用,弱引用,虚引用有什么用?
强引用>软引用>弱引用>虚引用强引用(Strong Reference)它是最普遍的引用,比如Objectobj =new Object(),即使抛出OutOfMemoryError终止程序也不会回收具有强引用的对象,但是通过将对象设置为null来弱化引用,使其被回收String str = new String("abc"); //强引用软引用(Soft...原创 2019-04-17 22:32:53 · 306 阅读 · 0 评论