JVM
It 搬运工
日拱一卒。
展开
-
对象的自我救赎---finalize()
1. 哲学之生与死 在根搜索中不可达的对象,也并非“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少经历两次标记过程:如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否必要执行finalize()方法。当对下给你没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。 如果这个对象被判定为有必原创 2021-06-18 11:35:11 · 170 阅读 · 1 评论 -
java中的引用
1. 强引用 强引用就是指程序代码之中普遍存在的,类似“Object obj=new Object()”这类引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。2. 软引用 软引用用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常。软引用的源代码public class SoftRefere原创 2021-05-28 10:59:21 · 132 阅读 · 0 评论 -
判断对象是否可以回收的2种方式
1. 引用计数算法 给对象种添加一个引用计数器,每当有一个地方引用她时,计数器的值就加1;当引用失效时,计数j器就减1;任何时刻计数器都为0的对象就是不可能再被使用的。 引用计数器的实现简单,判断效率也很高,在大部分情况下它都是一个不错的算法,python就是使用这种算法。而java没有采用这种方式的原因是因为这种算法很难解决对象之间的相互循环引用的问题。2. 根搜索算法 通过一系列的名为“GC Roots”的对象作为起始点,从这原创 2021-05-24 14:23:01 · 200 阅读 · 0 评论 -
2种对象访问方式
1. 句柄Java堆中将会划分出一块内存来作为句柄池,reference中存储的对象就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息。2. 直接指针Java堆对象的布局就必须考虑如何放置访问类型数据的相关信息,reference中直接存储的就是对象的地址。3. 句柄方式与直接指针的比较句柄方式直接指针方式优点reference中存储的是稳定的句柄地址;在对象被移动时只改变句柄中的实例数据指针,而reference本身需要被修改访问速度原创 2021-05-19 17:11:36 · 114 阅读 · 0 评论 -
运行时数据区域
java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域。有的区域随着虚拟机进程的启动而存在,有些区域则是依赖于用户线程的启动和结束而建立和销毁。java虚拟机所管理的内存包括如下几个运行时数据区域:1. 方法区方法区是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。垃圾收集行为在这个区域是比较少出现的(相对于堆来说),但并非数据进入了方法区就如永久代的名字一样“永久”存在。这个区域的内存回收目标主要是针对常量池的.原创 2021-05-18 11:26:42 · 86 阅读 · 1 评论