JVM
不会修电脑的程序员
这个作者很懒,什么都没留下…
展开
-
如何判断对象是否还“活着”,是否需要清除?
判断对象是否还活着的第一种方法是引用计数算法,内容是:给对象添加一个引用计数器,每当有一个地方引用他时,计数器值就加1。引用失效时。计数器值就减1。任何时刻的计数器为0的对象就是不可能再被使用的。但是主流的java虚拟机里面没有选用引用计数算法来管理内存,其中最主要的原因是它很难解决对象之间循环引用的问题。举个简单的例子,对象A和B都有字段instance,赋值令A.instance = B及B.原创 2018-01-24 10:14:58 · 357 阅读 · 0 评论 -
JVM内存中各部分存放的内容
虚拟机内存中主要有程序计数器、虚拟机栈、本地方法栈、堆和方法区。程序计数器和虚拟机栈都是线程“私有”的内存。程序计数器是一块比较下的内存空间,主要村放代码执行的位置。分支、循环、跳转、异常处理、线程恢复等基础功能都需要一来这个计数器来完成。例如,多线程中,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,他们之间互不影响,独立存储。经常有人把j原创 2018-01-18 09:53:54 · 4478 阅读 · 0 评论 -
关于虚拟机中堆内存结构的详解
新建的对象会放在年轻带里面,年轻代填满会触发minor gc,minor gc会清除包括s0,s1在内的所有年轻代里面不用的垃圾。Eden(伊甸园)里面没有被清除的对象就是幸存下来的,就会被放入s0或者s1中,每次所有幸存对象必须放入一个survivor space区域,意味着必须有一个survivor space是空的。对象上面的数字代表他的年龄,即幸存的次数,每次幸存以后都会换survivor原创 2018-01-18 10:05:22 · 1992 阅读 · 0 评论 -
【JVM】创建对象时虚拟机做了什么?
我们都知道,在语言层面上,创建对象通常仅仅是一个new关键字而已。但是在虚拟机中,对象的创建是怎样的一个过程呢?虚拟机在遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程(具体过程这里不做详解)。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象原创 2018-01-19 16:09:06 · 434 阅读 · 0 评论 -
堆、栈和常量池的比较
JAVA中,有六个不同的地方可以存储数据:1.寄存器:最快的存储区,位于不同于其他存储区的地方——处理器内部。寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。2. 栈:存放基本类型的变量数据和对象的引用。位于通用RAM中,但通过它的“堆栈指针”可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放...转载 2018-08-06 09:11:11 · 1378 阅读 · 1 评论