jvm学习
文章平均质量分 77
yxking1
这个作者很懒,什么都没留下…
展开
-
JVM学习初级篇(六) 三色标记
上一篇文章讲到了垃圾回收的三种模式,其中最重要的是如何标记需要回收的垃圾对象,像Serial、Parallel这类的回收器,无论是单线程标记和多线程标记,其本质采用的是暂停用户线程进行全面标记的算法,好处就是简单,标记的很干净,缺点就是标记时间相对很长,导致STW的时间很长。 那么后来就有了并发标记,适用于CMS和G1,可以在不暂停用户线程的情况下对其进行标记,那么实现这种并发标记的算法就是三色标记法,最大的特点就是可以异步执行,从而可以用极少的中断时间或者不中断来进行整个...原创 2021-07-11 17:43:27 · 102 阅读 · 0 评论 -
JVM学习初级篇(二)常量池与方法区
方法区是一个抽象定义,可以想象成接口;元空间或永久代是具体的实现技术Java8版本以后,是用元空间来实现的方法区;在Java8之前的版本,则是。用永久代实现的方法区。Class类常量池 class类常量池中包含的是字面量和符号引用,如下图运行时常量池相较于Class文件常量池,运行时常量池更具动态性,和class文件的常量池是一一对应的,它就是class文件的constant_pool来构建的。运行时常量池中有两种类型,分别是符号引用和静态常量,其中静态常...原创 2021-07-01 00:45:22 · 184 阅读 · 2 评论 -
JVM学习初级篇(一)类的加载机制
当我们编写好了java代码后,源文件是如何加载使用的呢。这里就需要了解到类的加载机制。原创 2021-06-12 00:09:11 · 149 阅读 · 1 评论 -
JVM故障解决工具
常用JDK工具 jps(JVM Process Status Tool) 显示正在运行的虚拟机进程 ,一般工具都可以使用 -help 参数 查看使用规则>jps -helpusage: jps [-help] jps [-q] [-mlvV] [<hostid>]Definitions: <hostid>: <hostname>[:<port>]-q : 显示进程ID[...原创 2021-04-14 22:55:44 · 157 阅读 · 0 评论 -
JVM学习初级篇(三)Java堆
堆的组成区域Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收...原创 2020-04-16 12:04:11 · 163 阅读 · 0 评论 -
通过字节码分析try finally(五)
public class Test { public static void main(String[] args) { int i = show(); System.out.println(i); } public static int show(){ int i = 10 ; try{ ...原创 2020-04-03 00:46:33 · 112 阅读 · 0 评论 -
JVM学习初级篇(四) JVM的垃圾回收
这里先引用一篇文章https://www.cnblogs.com/wjh123/p/11142176.html强引用:键字new创建的对象所关联的引用就是强引用。只要还存在引用关系,gc就不会随意回收对象。如下图 public class StrongReference { public static void main(String[] a...原创 2020-04-01 16:12:15 · 164 阅读 · 0 评论 -
常量池和局部变量表(四)
这里都是针对jdk1.8的hotspot虚拟机讲解public class Demo1_1{ public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "ab"; String s4 = s1+s2; ...原创 2020-03-29 19:13:19 · 944 阅读 · 0 评论 -
认识二进制字节码文件内容(三)
二进制字节码主要包含3个重要的信息:类基本信息常量池类的方法定义(包含了虚拟机指令)首先我们可以先编写一个简单的java文件public class JvmDemo { public static void main(String[] args) { System.out.println("hello world"); }}打开...原创 2020-03-29 13:58:23 · 336 阅读 · 0 评论 -
栈和堆内存溢出诊断(二)
栈内存溢出:问题定位1.cpu占用过多定位:用top定位哪个进程对cpu占用过高 ps H -eo pid,tid,%cpu | grep 进程id(定位是哪个线程引起的cpu)占用过高 jstack进程id 可以根据线程id找到有问题的线程,进一步定位到问题代码的源码行号堆内存诊断:定位问题的方法可以参考如下方式:public class Demo { ...原创 2020-03-28 23:33:14 · 217 阅读 · 0 评论 -
走进JVM(一)
提起JVM,大家应该脑海中浮现出下面这个结构图Jvm结构中元空间和堆是线程共享,其他是线程私有.我们编写的java源代码,先编译成了二进制字节码,在通过类加载器放到了Jvm中运行。元空间:类的一些信息都放在了元空间,比如字段,静态属性,方法,常量等。堆:类创建的实例对象都放到堆,例如通过new出来的对象,jdk8后 原来的永久区内的字符串常量也移到了堆。堆里的对象调用方...原创 2020-03-27 17:42:32 · 127 阅读 · 0 评论 -
java对象占用内存
大家可能遇到过Object o = new Object(),在内存中占用多少空间。这里首先要了解java内存对象的布局:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。无论是32位还是64位的HotSpot,使用的都是8字节对齐。也就是说每个java对象,占用的字节数都是8的整数倍。1.基本数据类型占用的字节数,JVM规范中有明确的规定,无论是...原创 2020-03-06 17:04:09 · 208 阅读 · 0 评论