JVM
鲁花菜籽油
这个作者很懒,什么都没留下…
展开
-
Minor GC的过程
Minor GC的过程:复制->清空->交换1、Eden、SurvivorFrom复制到SurvivorTo,年龄+1 首先,当Eden区满的时候会触发第一次GC,把还活着的对象拷贝到SurvivorFrom区。当Eden区再次触发GC的时候会扫描Eden区和From区域,对这两个区域进行垃圾回收。经过这次回收后还存活的对象则直接复制到To区域,同时把这些对象的年龄+1(如果有对象的年龄已经达到了老年的标准,则复制到老年代)。2、清空Eden、SurvivorFrom 然后,清空E原创 2021-10-10 12:26:45 · 712 阅读 · 0 评论 -
垃圾回收算法
典型的垃圾回收算法有哪些?1、标记-清除算法 标记-清除算法分为两个阶段:标记阶段和清除阶段。标记阶段的任务是标记出所有需要被回收的对象,清除阶段就是回收被标记的对象所占用的空间。 标记-清除算法实现起来比较容易,但是有一个比较严重的问题就是容易产生内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。2、复制算法 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面转载 2021-10-09 22:37:37 · 1065 阅读 · 0 评论 -
类文件结构
Class 文件结构如下:ClassFile { u4 magic; //Class 文件的标志 u2 minor_version;//Class 的小版本号 u2 major_version;//Class 的大版本号 u2 constant_pool_count;//常量池的数量 cp_info constant_pool[constant_pool_c原创 2021-10-09 22:03:47 · 88 阅读 · 0 评论 -
堆栈的区别
说一下堆栈的区别?1、物理地址 堆的物理地址分配对对象是不连续的。在GC的时候需要考虑到不连续的分配,性能较慢。 栈使用的是数据结构中的栈,先进后出的原则,物理地址分配是连续的。性能快。2、存放的内容 堆存放的是对象的实例和数组。 栈存放:局部变量,操作数栈,返回结果。3、程序的可见度 堆对于整个应用程序都是共享、可见的。 栈只对于线程是可见的,线程私有。...原创 2021-10-09 21:53:31 · 348 阅读 · 0 评论 -
如何判断一个对象是否存活?
堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断那些对象已经死亡(即不能再被任何途径使用的对象)。判断对象是否存活有两种方法:引用计数法和可达性分析。1、引用计数法 给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。 但是这种方法很难解决对象之间相互循环引用的问题。2、可达性分析 通过GC Root对象为起点,从这些节点向下搜索,搜索所走过的路径叫引用链,当一个对象到GC Root没有任原创 2021-10-09 21:48:00 · 949 阅读 · 0 评论 -
双亲委派模型及其实现
双亲委派模型 一个类加载器收到一个类的加载请求时,它首先不会自己尝试去加载它,而是把这个请求委派给父类加载器去完成,这样层层委派,因此所有的加载请求最终都会传送到顶层的启动类加载器中,只有当父类加载器反馈自己无法完成这个加载请求时,子加载器才会尝试自己去加载。 双亲委派模型的好处:可以防止内存中出现多份同样的字节码。如果没有双亲委派模型而是由各个类加载器自行加载的话,如果用户编写了一个java.lang.Object的同名类并放在ClassPath中,多个类加载器都去加载这个类到内存中,系统中将会原创 2021-10-09 21:29:56 · 158 阅读 · 0 评论 -
JVM可以调优的参数选项
JVM调优参数-Xmx4g (最大堆内存大小)-Xms4g (初始化堆内存大小)-Xmn1200m-Xss512k (线程的堆栈大小)-XX:NewSize (新生代大小)-XX:NewRatio=4 (新生代和老生代占比)-XX:SurvivorRatio=8 (伊甸园空间和幸存者空间的占比)-XX:PermSize=100m-XX:MaxPermSize=256m-XX:MaxTenuringThreshold=15 (对象在年轻代存活时间)如果是堆内存不够:尝试调整转载 2021-10-09 18:35:12 · 165 阅读 · 0 评论 -
堆、栈、方法区和常量池的概念
转载自:堆、栈、方法区和常量池的概念转载 2020-09-10 17:05:47 · 95 阅读 · 0 评论