JVM
万事胜意❀
这个作者很懒,什么都没留下…
展开
-
JVM 内存模型
JVM 内存模型 1. 堆 各线程共享的内存区域,在JVM启动时创建,是JVM内存中最大的一块区域。存放对象的实例(对象本身,该对象的引用存在栈中)和数组,由GC进行垃圾处理回收,堆内存的大小可以通过参数-xmx(最大值)和-xms(初始值)进行设置。 2. 方法区 各线程共享的内存区域,存储虚拟机加载的类的信息(类名称、方法信息、字段信息)、常量、静态变量。 被划分为两个主要的区域:持久代和代码...原创 2019-01-19 14:17:27 · 141 阅读 · 0 评论 -
元空间
元空间 jdk8之前是永久代,jdk8之后换成了元空间,开始一直不知道永久代与元空间的区别,直到听到一句解释:永久代和元空间都是方法区的一种实现。 永久代缺点: 永久代的大小是在启动时固定好的,很难进行调优。类和方法信息等比较啊难确定大小,因此对于永久代的大小指定比较困难 字符串在永久代中,容易出现性能问题和OOM。 永久代会为 GC 带来不必要的复杂度,并且回收效率偏低。 4.永久代中的元数据...原创 2019-01-19 14:18:15 · 1567 阅读 · 0 评论 -
对象的创建
对象的创建 对象创建过程: 当虚拟机遇到一条new指令时,首先回去检查这个指令的参数是否能在常量池中定位到一个类的符号应用,并且检查这个符号引用代表的类是否已经加载、解析和初始化过。,如果没有,还要先执行相应的类加载过程。(关于类加载过程,后续……) 类加载通过之后,为新生对象分配内存。内存分配有两种方式:指针碰撞和空闲列表。下文解释 内存分配完成之后,虚拟机需要将分配到的内存空间都初始化为零值...原创 2019-01-21 17:50:42 · 101 阅读 · 0 评论 -
如何判断对象是否存活
1.如何判断对象是否存活 1.1引用计数法 给对象中添加一个 引用计数器,每当有一个地方引用它时,计数器值+1,当引用失效时,计数器值-1。任何时刻计数器值为0的对象就是不可能再被使用的。但是这个方法有个问题不能解决:就是当两个对象相互引用时,他们的计数器值永远不会变成0,导致两个对象无法被回收。 1.2可达性分析算法 在主流的商用程序语言(Java、C#)的主流实现中,都是称通过可达性分析来判...原创 2019-02-14 15:57:26 · 1025 阅读 · 0 评论 -
垃圾收集算法
1.标记-清除算法 “标记-清除”算法是最基础的垃圾收集算法,分为“标记”和“清除”两个阶段;当堆中的有效内存空间内耗尽的时候,就会停止整个程序,然后进行标记,清除工作。 标记:首先将所有死亡对象(在上一篇文章中有说到,如果判断对象是否存活)打上标记 清除:清除的过程将遍历堆中所有的对象,将所有被标记的对象全部清除。 缺点: 1.效率比较低,因为要遍历所有的对象,并且在进行垃圾回收过程中,需要...原创 2019-02-14 17:17:06 · 360 阅读 · 0 评论 -
对象在内存中的存储
对象包含以下几部分:对象头、实例数据、对齐填充,如下图 1. 对象头 对象头中包含了MarkWord、class指针、以及数组的长度(当对象为数组时才会有)。 MarkWord: - GC分代年龄:占4位,所以当对象GC年龄15岁之后,就会被分配到老年代去 - 锁状态:01-未锁定,00-轻量级锁,10-重量级锁,11-GC标记,01-可偏向 class指针: 对象指向它的类元数据的指针,虚拟机...原创 2019-01-23 14:41:57 · 686 阅读 · 0 评论 -
对象的访问方式
对象访问方式 目前主流的访问对象的方式有两种:使用句柄和直接指针 1.通过句柄访问对象 如果是通过句柄的方式来访问对象,那么Java堆中就会划分出一块内存来作为句柄池。reference中存储的就是对象的句柄地址。句柄中包含了对象的实例数据和类型数据的具体地址信息。 优势: reference中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象)时只会改变句柄中的实例数据指正,而refere...原创 2019-01-23 16:27:28 · 783 阅读 · 0 评论 -
内存分配与回收策略
1.对象优先在Eden分配 大多数情况下,对象在啊新生代Eden中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。 对象在Minor GC过程中,发现对象比较大,剩余Survivor空间不足以容纳该对象,那么该对象就会通过分配担保机制被提前转移到老年代去。 Minor GC:指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕死的特性,所以Minor GC...原创 2019-02-15 14:01:01 · 162 阅读 · 0 评论 -
JAVA内存模型
1.主内存和工作内存 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 JAVA内存模型规定 所有的变量都存储在主内存中 每个线程有自己的工作内存(线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行) 不同线程之间无法直接访问对方工作内存中的变量。线程间变量值的传递靠主...原创 2019-05-10 16:00:38 · 110 阅读 · 0 评论