
JVM
小毛贼_哪里逃
这个作者很懒,什么都没留下…
展开
-
JVM--StringTable字符串常量池
结构 常量池中的信息都会被加载到运行时常量池中。String table又称为String pool,字符串常量池,其存在于堆中(jdk1.7之后改的)。最重要的一点,String table中存储的并不是String类型的对象,存储的而是指向String对象的索引,真实对象还是存储在堆中。此外String table还存在一个hash表的特性,里面不存在相同的两个字符串...原创 2020-03-20 12:15:17 · 571 阅读 · 0 评论 -
JVM--方法区内存溢出:永久代或元空间内存溢出
演示程序:增加参数改变元数据空间大小: 1.8以前版本:-XX:MaxPermSize=8m1.8以后版本:-XX:MaxMetaspaceSize=8m1.8以前版本会报错:java.lang.OutOfMemoryError: PermGen space1.8以后版本会报错:java.lang.OutOfMemoryError: Metaspace...原创 2020-03-19 18:12:35 · 1339 阅读 · 0 评论 -
JVM--方法区
所有线程共享 保存和类相关的信息,如类方法、属性、构造方法、运行时常量池(run-time constant pool)等 方法区也会内存溢出:java.lang.OutOfMemoryError 永久代和元空间是方法区的实现,如下图:1.6和1.8版本的区别...原创 2020-03-19 17:52:29 · 190 阅读 · 0 评论 -
JVM--堆内存诊断
jps工具:查看当前系统中有哪些java进程,获取进程号 jmap工具:jmap -heap 进程id,查看堆内存占用情况,只能监测某一时间点的内存情况,可多次运行后,查看Eden区的内存使用情况 jconsole工具:图形界面的,多功能的监测工具,可以连续监测 垃圾回收后,内存占用仍然很高:使用jvisualvm工具把内存dump下来分析 ...原创 2020-03-19 17:35:16 · 190 阅读 · 0 评论 -
JVM--堆内存
通过new关键字创建出来的对象都会使用堆内存 堆内存和方法区是线程共享的,所以堆中的对象都要考虑线程安全问题 有垃圾回收机制 堆内存溢出:java.lang.OutOfMemoryError:java heap space 堆中对象过多过大,尽量在开发阶段把堆内存设置小一些,这样可以迟早发现程序的性能瓶颈 使用-Xmx size参数可控制堆的内存大小 ...原创 2020-03-19 16:57:59 · 137 阅读 · 0 评论 -
JVM--本地方法栈
给native修饰方法的内存空间,为线程私有的原创 2020-03-19 16:42:12 · 173 阅读 · 0 评论 -
JVM--线程运行诊断
CPU占用内存过多 定位进程id:top 定位线程id:ps H -eo pid,tid,%cpu| grep 进程id jstack 进程id,可以根据线程id找到有问题的线程(一般为Thread-开头,需要把ps获取的线程id转换成16进制的) 程序运行很长时间没有结果 jstack 进程id,查看最后面的输出文本,发现出现了死锁...原创 2020-03-19 16:30:12 · 213 阅读 · 0 评论 -
JVM--虚拟机栈
栈:每个线程运行时所需要的内存为虚拟机栈,每个线程对应一个栈。数据结构特点是先进后出(类比子弹夹), 栈桢:每个栈由多个栈桢(Frame)组成。当执行一个方法的时候,会把这个方法的参数、局部变量、返回地址等压入栈,这块内存区域,称之为栈桢,当方法运行结束的时候从栈中弹出。 每个线程只能有一个活动栈桢,对应着当前正在执行的那个方法(顶部的栈桢) 示例 注意事项:垃圾...原创 2020-03-19 16:10:08 · 157 阅读 · 0 评论 -
JVM--程序计数器(寄存器)
作用:记住下一条jvm指令的执行地址,交给解释器,解释器根据位置找到JVM指令翻译成机器码,最后给CPU执行特点:线程私有:当CPU执行完某个线程时间片内的指令后,需要记住此线程的指令地址。当此线程重新获取时间片后,可以继续执行未执行的指令。 根据JVM规范,是唯一一个不会存在内存溢出的内存区域。...原创 2020-03-19 15:17:00 · 501 阅读 · 0 评论