JVM
文章平均质量分 92
深入理解jvm
EmineWang
计算机专业,资深java开发工程师,从事后端开发、架构方向,热爱技术,热爱分享,愿对你有所帮助,感恩大家的支持,欢迎来信交流~~
展开
-
JVM内存模型分析
文章目录class 文件解读类加载器方法区:常量池:什么是常量池?为什么需要常量池常量池分类:方法调用过程对象内存布局:栈桢:栈桢内容栈中可能出现哪些异常StackOverflowError:栈溢出错误OutOfMemoryError:内存不足Native Method Stacks(本地方法栈):句柄池方法区永久代和元空间PermGen(永久代)元空间使用元空间的优点什么是字面量:方法区:线程栈问题QA:class 文件解读https://blog.csdn.net/lzy_zhi_yuan/ar原创 2021-12-28 14:58:14 · 909 阅读 · 0 评论 -
G1和ZGC垃圾收集器
G1的瓶颈:标记阶段停顿分析初始标记阶段:初始标记阶段是指从GC Roots出发标记全部直接子节点的过程,该阶段是STW的。由于GC Roots数量不多,通常该阶段耗时非常短。并发标记阶段:并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析,找出存活对象。该阶段是并发的,即应用线程和GC线程可以同时活动。并发标记耗时相对长很多,但因为不是STW,所以我们不太关心该阶段耗时的长短。再标记阶段:重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的。清理阶段停顿分析清理阶段清点出有存原创 2021-08-04 23:54:32 · 2151 阅读 · 0 评论 -
JVM垃圾收集器原理分析
标记-清除算法将需要回收的对象标记,并且清除。大量内存碎片,大对象无法存储复制算法将内存分成两块,每次将存活的对象复制到另一块上去,并且把使用的空间一次性清除掉。空间利用率低,不适合大对象的频繁复制经典的新生代收集算法,将内存划分一块较大的Eden,和大小相等的survivor两块,每次回收时将eden和survivor中还存活的对象复制到另一块survivor中,并一次性清理掉,保证每次都会有整块的内存回收 适用于新生代的小对象,频繁的复制操作标记-整理算法将需要回收的对象清除,留下来的存活的原创 2021-08-04 00:45:59 · 334 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用、finalize
Java引用介绍Java从1.2版本开始引入了4种引用,这4种引用的级别由高到低依次为:强引用 > 软引用 > 弱引用 > 虚引用⑴强引用(StrongReference)强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。⑵软引用(SoftReference)如果一个对象只具有软引用,则内存空间足原创 2021-08-01 22:21:46 · 377 阅读 · 0 评论 -
String.intern()分析jdk1.6和1.7后变化
先看如下代码输出结果 String str = new StringBuilder("11").append("va").toString(); System.out.println(str.intern() == str); System.out.println("---------------------"); Stri...原创 2019-01-23 16:02:04 · 4352 阅读 · 0 评论 -
JVM类加载过程
JVM类加载分为5个过程:加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载加载:将.class文件(并不一定是.class。可以是ZIP包,网络中获取)中的二进制字节流读入到JVM中连接: 连接分三步: 验证 准备 解析验证: 验证主要确保加载进来的字节流符合JVM规范准备:为静态变量在方法区分配内存,并设置默认初始值!解析...原创 2019-11-13 14:45:41 · 267 阅读 · 0 评论 -
jvm堆、栈数据区域分配
栈线程私有,不共享生命周期与线程相同。每个方法在执行的同时都会创建一个栈帧,用于存放局部变量每个方法从调用到执行完成,都对应一个在虚拟机栈中入栈到出栈的过程内存空间连续,速度快堆所有线程共享所有对象实例以及数组都在堆在分配内存空间不连续,速度慢,但是灵活局部变量和成员变量的分配局部变量引用类型:变量名(即地址)存放在栈,实例存放在堆。地址值在栈,所以随着方法结束,...原创 2019-01-22 18:12:05 · 3975 阅读 · 0 评论 -
查看进程,生成dump文件
查看相关进程pidps -aux --sort -rss 或 ps -ef|grep java执行jmap命令,生成dump文件jmap -dump:format=b,file=serviceDump.dat [java进程的PID]打开: ,jvisualvm->文件->装载dump文件...原创 2019-08-20 13:44:45 · 1870 阅读 · 0 评论 -
jvm命令行执行和可视化工具
命令行:jps -l查找jvm进程jmap -dump:format=b,file=d:\dump.bin 15296生成dump 文件(15296为1中找出的进程号)jhat d:\dump.bin分析dump文件执行上面命令,浏览器中http://localhost:7000/jstack:堆栈工具,生成jvm当前时刻的线程快照,定位线程出现长时间停顿...原创 2019-01-30 15:08:38 · 4146 阅读 · 0 评论 -
jvm启动参数设置OOM异常时,自动生成dump文件
设置如下2个参数即可:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heapdump.hprof-XX:+HeapDumpOnOutOfMemoryError 设置当首次遭遇内存溢出时导出此时堆中相关信息-XX:HeapDumpPath=/tmp/heapdump.hprof 指定导出堆信息时的路径或文件名如:ja...原创 2019-01-30 14:49:43 · 42254 阅读 · 5 评论 -
jvm之PermGen的离开与MetaSpace新生
测试代码如下: public static void main(String[] args){ // jdk 1.6 设置 -XX:PermSize=10M -XX:MaxPermSize=10M // jdk 1.7 1.8只有设置-Xmx20m -Xms20m -XX:-UseGCOverheadLimit才能起作用(这里的-XX:-UseGCOver...原创 2019-01-23 17:44:32 · 4056 阅读 · 0 评论 -
关于第二版《深入理解java虚拟机》中“栈溢出”案例的不同看法
文中说明:使用-Xss参数减少栈内存容量。结果:抛出StackOverflowError异常,异常出现时输出的堆栈深度缩小。定义了大量的本地变量,增大此方法帧中本地变量表的长度。结果:抛出StackOverflowError,异常出现时输出的堆栈深度缩小。 书中代码如下: private int stackLength = 1; public void stackLea...原创 2019-01-24 15:01:38 · 3819 阅读 · 0 评论 -
线上内存溢出原因排除
【分析】如果机器比较紧缺,第一时间要恢复应用,可以直接先将该节点下线,保存线程栈快照,和堆内存快照。然后进行重启。生产机器一般都是集群部署,如果只是某一台出现这种情况,可以不着急立即重启,保存现场,1.看看最近有什么上线,分析改动代码,2. 如果没有找到问题使用top 命令找出比较消耗资源的进程,使用top hp命令打印该进程下面比较消耗资源的线程3. 使用jstack 打印出线程信息,看看是哪个类。或者是什么类型的线程。4. 再结合使用jmap -histo找出内存的大对象,按照对象大小排序。原创 2021-12-28 14:56:05 · 2623 阅读 · 1 评论