随笔分类 - jvm
摘要:不可变性 String 在jdk8中 是 char value[];jdk9中式byte[] 更加节约内存空间。String 代表不可变的字符序列,对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。 /** * String代表不可变的字符序列,拥有不可变性。对字符串重
阅读全文
摘要:故事背景 cpu持续走高,直接导致服务器宕机,无法对外提供服务。 排查思路 1. 一般cpu过高只有两种情况:1.线程太多,可以用命令看一下;2.频繁full gc,因为full gc是很消耗cpu资源的。 2. 用jstat命令看了下,果然是频繁full gc造成的。但是内存分配比例和大小还是很合
阅读全文
摘要:在前面文章我们了解到了jvm的内存模型、对象分配的规则、以及对象何时进入到老年代、垃圾回收器,并且知道jvm调优的本质就是对堆内存进行调优,尽量使对象留在新生代中、少触发老年代gc。那么本文将介绍生产环境上如何去排查问题这样的一个思路。用的是最原始、有low、也最有效的jstat命令,因为每个公司情
阅读全文
摘要:Young GC 案例准备 /** * 案例代码 */ public class Demo1 { public static void main(String[] args) { // 1. 在eden区创建了一个1m数组对象,main线程虚拟机栈中 // 的main()方法栈帧的局部变量arry1
阅读全文
摘要:代码运行过程 我们写的 “.java” 文件打包成 jar、war 文件后就部署到服务器上去运行了。可能是 tomcat 这样的容器,也可能是 java 命令来启动。 但其实我们用反编译工具就可以看到,打包后的文件是 “.class” 文件,一旦启动这个项目,其实就是启动一个jvm来运行这个系统,由
阅读全文
摘要:在jvm调优之前,我们必须先了解jvm的内存模型与GC回收机制,这些在我前面的文章里面有介绍!接下来我们通过一个案例来调整jvm性能。 一测试案例: 1.1 编写demo import java.text.DecimalFormat; /** -Xms 堆初始值 -Xmx 堆最大可用值 -Xmn 年
阅读全文
摘要:GC是如何去判断对象是否能被回收的 jvm中有个垃圾回收线程,它是低优先级的,当虚拟机空闲或堆内存不足时,它就会去清除不可达对象。 早期GC判断对象是否能被回收时用的引用计数法,后来改进成了可达性分析法。 引用计数法:比如A引用了B它就会记录下一个1 ,同理B也去引用A。引用计数法只有在为0的时候才
阅读全文
摘要:为什么jvm要有内存模型 在 上一章节 我们清楚代码的运行流程之后,那么下面一段代码我们就可以知道: 1. main线程启动,main()方法的栈帧压入main线程的虚拟机栈2. web()方法的栈帧也压入main线程的虚拟机栈3. web()栈帧中创建了局部变量test,并且指向Test对象4.
阅读全文
摘要:五大内存区 jvm五大内存区域(即jvm运行时数据区),描述的是类被加载时,经过解析后,存储到特定的数据区。方法区和堆是所有线程共享的,而栈和计数器是线程私有的。栈处理程序运行的问题,堆处理数据的存储问题。所以才有堆栈分离。 方法区:又被称为元空间,用来存储类的信息,例如:方法,方法名,返回值,常量
阅读全文