![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
liu_542449630
这个作者很懒,什么都没留下…
展开
-
Java中init和clinit区别
init和clinit方法执行时机不同init是对象构造器方法,也就是说在程序执行 new 一个对象调用该对象类的constructor方法时才会执行init方法,而clinit是类构造器方法,也就是在jvm进行类加载的初始化阶段JVM会调用clinit方法。init和clinit方法执行目的不同init是instance实例构造器,对非静态变量解析初始化,而clinit是class类构造器对静态变量,静态代码块进行初始化。...原创 2020-07-04 20:00:24 · 328 阅读 · 0 评论 -
Java中如何破坏双亲委派模型
破坏双亲委派模型文中的双亲委派模型并不是一个强制性的约束模型,而是Java设计者推荐给开发者的类加载器实现方式。在Java的世界中大部分的类加载器都遵循这个模型,但是也有例外,目前为止,双亲委派模型主要出现过三次较大规模的“被破坏”情况。第一次:在双亲委派模型发布之前,即JDK1.2之前。为了兼容之前JDK版本中自定义类加载器的实现。(即没有按照双亲委派模型来设计)**解决办法:**把自己的类加载器逻辑写到findClass()方法中,在loadClass()方法的逻辑里如果父类加载失败,.原创 2020-07-03 11:24:23 · 831 阅读 · 0 评论 -
Java方法区垃圾回收
永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。如何判断⼀个常量是废弃常量?运行时常量池主要回收的是废弃的常量。那么,我们如何判断一个常量是废弃常量呢?假如在常量池中存在字符串”abc”,如果当前没有任何String对象引用该字符串常量的话,就说明常量”abc”就是废弃常量, 如果这时发生内存回收的话而且有必要的话,”abc”就会被系统清理出常量池。如何判断⼀个类是⽆⽤的类?判定一个常量是否是“废弃常量”比较简单,而要判定一个类是否是“无用的类”的条件则相对苛刻许多。类需要同时满足原创 2020-07-03 11:15:47 · 491 阅读 · 0 评论 -
Java静态常量池和运行时常量池
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。运行时常量池相对于Class文件常量池的另外一个重要特征就是具备动态性,Java语言并不要求常量一定只有在编译期才能产生原创 2020-07-03 11:12:46 · 338 阅读 · 0 评论 -
Java静态分派 & 动态分派
静态类型:是变量声明时的类型实际类型:变量实例化时采用的类型静态分派所有依赖静态类型来定位方法执行版本的分派动作,都称为静态分派,静态分派的最典型应用就是多态性中的方法重载。静态分派发生在编译阶段,因此确定静态分配的动作实际上不是由虚拟机来执行。动态分派向上转型后调用子类覆写的方法便是一个很好地说明动态分派的例子。在判断执行父类中的方法还是子类中覆盖的方法时,如果用静态类型来判断,那么无论怎么进行向上转型,都只会调用父类中的方法,但实际情况是,根据对父类实例化的子类的不同,调用的是.原创 2020-07-03 11:09:37 · 123 阅读 · 0 评论 -
Java中的内存泄露(面试)
内存泄露概念内存泄露就是堆内存中不再使用的对象在垃圾回收期无法从被回收。因为这些对象仍然存在者引用,所以垃圾收集器不会回收。内存泄露的症状:应用程序长时间连续运行时性能严重下降;应用程序中的OutOfMemoryError堆错误;自发且奇怪的应用程序崩溃;Java中内存泄露类型static字段引起的内存泄露大量使用static字段会潜在的导致内存泄露,在Java中,静态字段通常拥有与整个应用程序相匹配的生命周期。解决办法:最大限度的减少静态变量的使用;单例模式时,依赖于延迟加载.原创 2020-07-03 10:58:56 · 246 阅读 · 0 评论 -
JVM进程启动会启动哪些线程
每当使用java命令执行一个带main方法的类时,就会启动JVM(应用程序),实际上就是在操作系统中启动一个JVM进程,JVM启动时,必然会创建以下5个线程:main:主线程,用于执行我们编写的 java程序的main方法。Reference Handler :它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。Finalizer:JVM在垃圾收集时会将失去引用的对象包装成 Finalizer对象(Reference的实现),并放入ReferenceQueue,由Final原创 2020-07-03 10:45:19 · 542 阅读 · 0 评论 -
Java对象创建的过程(面试)
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。为什么对象内存大小在类加载完成之后可确定?https://www.zhihu.com/question/63522204内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),如...原创 2020-07-03 10:33:13 · 1663 阅读 · 0 评论 -
HotSpot逃逸分析
HotSpot逃逸分析逃逸分析并不是直接的优化手段,它是通过动态分析对象的作用域,为其它优化手段如栈上分配、标量替换和同步消除等提供依据,发生逃逸行为的情况有两种:方法逃逸、线程逃逸。方法逃逸:当一个对象在方法中定义之后,作为参数传递到其它方法中; 线程逃逸:如类变量或实例变量,被其它线程访问到;如果不存在逃逸行为,则可以对该对象进行如下优化:同步消除、标量替换和栈上分配。同步消除线程同步本身比较耗时,如果确定一个对象不会逃逸出线程,无法被其它线程访问到,那该对象的读写就不会存在竞争,则可以原创 2020-07-03 09:53:17 · 345 阅读 · 1 评论 -
如何减少GC出现的次数(GC优化)
对象不用时最好显式置为 Null一般而言,为 Null 的对象都会被作为垃圾处理,所以将不用的对象显式地设为 Null,有利于 GC 收集器判定垃圾,从而提高了 GC 的效率。尽量少用 System.gc()此函数建议JVM 进行主GC,虽然只是建议而非一定,但很多情况下它会触发主 GC,从而增加主 GC 的频率,也即增加了间歇性停顿的次数。尽量少用静态变量 静态变量属于全局变量,不会被 GC 回收,它们会一直占用内存。尽量使用 StringBuffer, 而不用String...原创 2020-07-03 09:44:16 · 3887 阅读 · 0 评论 -
JDK1.8 方法区的变化
方法区的垃圾回收主要分为两部分:常量池中废弃的常量和不再使用的类JDK1.7 vs JDK1.8在JDK1.7及以前,HotSpot虚拟机将Java类信息、常量池、静态变量、即时编译器编译后的代码等数据,存储在Perm(永久带)里(对于其他虚拟机如BEA JRockit、IBM J9等是不存在永久带概念的),类的元数据和静态变量在类加载的时候被分配到Perm里,当常量池回收或者类被卸载的时候,垃圾收集器会回收这一部分内存,但效果不太理想。 JDK 1.8中则把永久代给完全删除了,取而代之的是Me原创 2020-07-03 09:40:29 · 929 阅读 · 1 评论