JVM
IronWring_Fly
这个作者很懒,什么都没留下…
展开
-
Java中的init方法和clinit方法
Java在编译之后,会在字节码中生成init方法。创建实例的时候会调用该方法,该方法会将按一下顺序执操作: 父类成员变量 --> 父类语句块 --> 父类构造函数 --> 子类成员变量 --> 子类语句块 --> 子类构造函数。 Java编译后,会在字节码中生成clinit方法,JVM在类加载–验证–解析–初始化的初始化阶段调用该方法,该方法会将按一下顺序...原创 2019-09-06 15:44:57 · 1515 阅读 · 0 评论 -
Java对象初始化的过程
1. 类加载检查 首先在常量区检查有没有该类的引用,如果没有,就开始执行类的加载,解析,初始化这个过程。2. 分配内存 类加载之后就知道需要给对象分配多少内存,分配内存的方法有“碰撞指针”和“空闲列表”两种方法。3. 初始化0值 给对象的成员变量初始化0值,这样不给成员变量赋值也可以直接用。4. 设置对象头 设置对象头内容,包括实例是哪个类的实例,类的元信息位置,GC分代年龄...原创 2019-09-06 16:24:24 · 179 阅读 · 0 评论 -
Java引用
Java中的引用分强引用、软引用、弱引用、虚引用。 强引用:常用Object object = new Object,只要强引用还在,垃圾回收器就不会回收这样的对象。 软引用:用来描述还有用但非必须的对象,如果系统内存不够用了,才会回收这些引用。 弱引用:用来描述非必须的对象,不管内存够不够用,当开始进行垃圾回收的时候,都会回收掉这些被弱引用关联的对象。 虚引用:最弱的一种引用...原创 2019-09-06 17:47:28 · 98 阅读 · 0 评论 -
字符串常量区
Java设计者为了提高字符串的性能,设计了字符串常量池。在方法区中。 JDK 1.8 中,已经把字符串常量池从方法区的运行时常量池中分离到堆中了。字符串常量池中存储的就是对象。参考资料:JDK1.8版本java字符串常量池里存的是String对象还是引用? 利用一个题目巩固一下:String name = new String(“A” + ”B”);创建了几个对象:三个字符...原创 2019-09-14 11:11:34 · 830 阅读 · 0 评论 -
JVM内存模型
堆这是一个可共享的运行时数据区域,将实际对象存储在内存中。他在虚拟机启动时实例化。堆内存可以分配给所有的类实例和数组。对大小可以是固定的,也可以是动态的,这取决于系统的设置。堆区域的垃圾收集是强制性的。方法区他是堆区域的逻辑部分,在虚拟机启动的时候创建。用来存储类信息,常量,静态变量等可以不用在内存中连续虚拟机栈创建线程时创建虚拟机栈,用来存储数据和部分结果,这些结...原创 2019-09-14 19:31:42 · 146 阅读 · 0 评论 -
JVM入门
JVM的知识也算是看了好几天了,也写了几篇博客了,那怎么今天才说入门呢?因为,我今天猛然醒悟,之前的路子走错了。 JVM,全称 java virtual machine ,也就是虚拟机,说到虚拟机就不禁让人想起了VMware。提到VMware就让人不经想到了真实的计算机,再进一步,就会想到现代PC都在用的冯诺伊曼结构。 JVM中的很多概念,诸如类加载机制,内存模型等等乱七八糟的东西,这...原创 2019-09-15 10:17:33 · 172 阅读 · 0 评论 -
JVM的GC之垃圾判断与回收方法
判断一个对象是否是垃圾的方法一、计数法。 维护一个引用计数器,某个对象如果被引用了,就对计数器加一,不被引用了,就减一。最后引用计数器值为0的就判定其为垃圾。问题: 如果有两个互相引用的对象,会造成引用计数器无法清零,导致内存泄漏。二、标记法(可达性分析) 从GC Roots开始找到所有被引用的对象,并对其进行标记。最终没有被标记的对象将其判定为垃圾,可以解决对象之间互相引用的问...原创 2019-09-15 15:14:21 · 555 阅读 · 0 评论 -
JVM之垃圾回收
Java对象的存活周期也满足二八定律,也就是说,大约有80%左右的对象生命周期很短,需要将他们及时的清理掉,而仅仅20%左右的对象存活周期比较长,进行垃圾回收的时候,就需要注意。 根据对象存活周期的规律,JVM将内存划分为了新生代和老年代,新生代对应存活周期短的对象,老年代对应存活周期比较长的对象。 新生代又划分为Eden区和两个大小相同的Survivor区,由from指针和to指针...原创 2019-09-15 17:12:21 · 171 阅读 · 0 评论