草庐IT

jvm-debug

全部标签

结合代码和内存变化图一步步弄懂JVM的FullGC

1.年轻代存活的对象太多,老年代了放不下01.示例代码publicclassDemoTest1{publicstaticvoidmain(String[]args){byte[]array1=newbyte[4*1024*1024];array1=null;byte[]array2=newbyte[2*1024*1024];byte[]array3=newbyte[2*1024*1024];byte[]array4=newbyte[2*1024*1024];byte[]array5=newbyte[128*1024];byte[]array6=newbyte[2*1024*1024];}02.

结合代码和内存变化图一步步弄懂JVM的FullGC

1.年轻代存活的对象太多,老年代了放不下01.示例代码publicclassDemoTest1{publicstaticvoidmain(String[]args){byte[]array1=newbyte[4*1024*1024];array1=null;byte[]array2=newbyte[2*1024*1024];byte[]array3=newbyte[2*1024*1024];byte[]array4=newbyte[2*1024*1024];byte[]array5=newbyte[128*1024];byte[]array6=newbyte[2*1024*1024];}02.

【JVM】JDK7后intern方法总结

JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈。测试代码1如下:@Testpublicvoidtest01(){Stringstr2=newStringBuilder("12").append("34").toString();Stringintern=str2.intern();Stringstr1="1234";System.out.println(str2==intern);System.out.println(str1==intern);}输出结果:truetrue测试代码2如下:@Testp

【JVM】JDK7后intern方法总结

JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈。测试代码1如下:@Testpublicvoidtest01(){Stringstr2=newStringBuilder("12").append("34").toString();Stringintern=str2.intern();Stringstr1="1234";System.out.println(str2==intern);System.out.println(str1==intern);}输出结果:truetrue测试代码2如下:@Testp

【JVM】运行时内存分配

程序计数器用于标识线程执行到了字节码文件(class文件)的哪一行,当执行native方法时,值为undefined,各个线程私有Java虚拟机栈每个线程独有,每个方法执行时会创建一个栈帧,用于存储局部变量表等方法信息,即方法的执行会伴随着一个栈帧的入栈出栈。栈帧的组成  如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackoverflowError异常栈最大深度由栈内存大小和局部变量表大小确定,即栈大小固定,局部变量表越大,栈深度越小,栈大小可通过-Xss参数设置,默认为1m如果栈动态扩展失败,会抛出OutOfMemoryError异常,不过hotspot虚拟机不支持栈动态扩展,申

【JVM】运行时内存分配

程序计数器用于标识线程执行到了字节码文件(class文件)的哪一行,当执行native方法时,值为undefined,各个线程私有Java虚拟机栈每个线程独有,每个方法执行时会创建一个栈帧,用于存储局部变量表等方法信息,即方法的执行会伴随着一个栈帧的入栈出栈。栈帧的组成  如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackoverflowError异常栈最大深度由栈内存大小和局部变量表大小确定,即栈大小固定,局部变量表越大,栈深度越小,栈大小可通过-Xss参数设置,默认为1m如果栈动态扩展失败,会抛出OutOfMemoryError异常,不过hotspot虚拟机不支持栈动态扩展,申

HC32L110(五) Ubuntu20.04 VSCode的Debug环境配置

目录HC32L110(一)HC32L110芯片介绍和Win10下的烧录HC32L110(二)HC32L110在Ubuntu下的烧录HC32L110(三)HC32L110的GCC工具链和VSCode开发环境HC32L110(四)HC32L110的startup启动文件和ld连接脚本HC32L110(五)Ubuntu20.04VSCode的Debug环境配置本文介绍在Ubuntu20.04下,VSCode中如何设置对HC32L110进行debug仓库地址:https://github.com/IOsetting/hc32l110-template如果转载,请注明出处.环境说明本文使用的软硬件环境已

HC32L110(五) Ubuntu20.04 VSCode的Debug环境配置

目录HC32L110(一)HC32L110芯片介绍和Win10下的烧录HC32L110(二)HC32L110在Ubuntu下的烧录HC32L110(三)HC32L110的GCC工具链和VSCode开发环境HC32L110(四)HC32L110的startup启动文件和ld连接脚本HC32L110(五)Ubuntu20.04VSCode的Debug环境配置本文介绍在Ubuntu20.04下,VSCode中如何设置对HC32L110进行debug仓库地址:https://github.com/IOsetting/hc32l110-template如果转载,请注明出处.环境说明本文使用的软硬件环境已

98%的程序员,都没有研究过JVM重排序和顺序一致性

文章整理自博学谷狂野架构师重排序数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a=1;b=a;写一个变量之后,再读这个位置。写后写a=1;a=2;写一个变量之后,再写这个变量。读后写a=b;b=1;读一个变量之后,再写这个变量。上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。注意,这里所说的数据依赖性仅针对单个处理器中执

98%的程序员,都没有研究过JVM重排序和顺序一致性

文章整理自博学谷狂野架构师重排序数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a=1;b=a;写一个变量之后,再读这个位置。写后写a=1;a=2;写一个变量之后,再写这个变量。读后写a=b;b=1;读一个变量之后,再写这个变量。上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。注意,这里所说的数据依赖性仅针对单个处理器中执