Java虚拟机内存基础、垃圾收集算法及JVM优化
摘要:1 JVM 简单结构图 1.1 类加载子系统与方法区 类加载子系统负责从文件系统或者网络中加载 Class 信息,加载的类信息存放于一块称 为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是 Class 文件中常量池部分的内存映射)
阅读全文
posted @
2019-05-07 23:51
kosamino
阅读(615)
推荐(0) 编辑
Jstack定位CPU使用最多的线程及代码
摘要:jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。 寻找进程 执行命令jps找出Java进程ID,
阅读全文
posted @
2019-03-06 01:44
kosamino
阅读(1782)
推荐(0) 编辑
设置Tomcat的JAVA_OPTS参数
摘要:修改$TOMCAT_HOME/bin/catalina.bat添加set JAVA_OPTS= ...rem Execute The Requested Command set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx512m -XX:MaxNewSiz
阅读全文
posted @
2017-11-01 20:40
kosamino
阅读(17604)
推荐(0) 编辑
Java内存分配及变量存储位置实例讲解
摘要:Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识。一般Java在内存分配时会涉及到以下区域: ◆寄存器:我们在程序中无法控制 ◆栈:存放基本类型的数据和对
阅读全文
posted @
2016-11-23 00:06
kosamino
阅读(14077)
推荐(5) 编辑
内存分配和回收策略
摘要:对象的内存分配,大方向上来说就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),主要对象分配在新生代的Eden区,如果启动了本地分配缓冲,将按照线程优先在TLAB(Thread Local Allocation Buffer)上分配。少数情况下也可能直接分配到老年代中,这些规
阅读全文
posted @
2016-11-22 23:03
kosamino
阅读(529)
推荐(0) 编辑
理解GC日志
摘要:每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 se
阅读全文
posted @
2016-11-22 22:20
kosamino
阅读(450)
推荐(0) 编辑
CMS为什么采用“标记-清除”算法
摘要:分代式GC里,年老代常用mark-sweep;或者是mark-sweep/mark-compact的混合方式,一般情况下用mark-sweep,统计估算碎片量达到一定程度时用mark-compact。这是因为传统上大家认为年老代的对象可能会长时间存活且存活率高,或者是比较大,这样拷贝起来不划算,还不
阅读全文
posted @
2016-11-18 00:33
kosamino
阅读(1785)
推荐(0) 编辑
虚拟机中的运行时栈帧
摘要:每个人都知道,各种各样的动画视频,都是由一帧一帧图片连续切换结果的结果而产生的,其实虚拟机的运行和动画也类似,每个在虚拟机中运行的程序也是由许多的帧的切换产生的结果,只是这些帧里面存放的是方法的局部变量,操作数栈,动态链接,方法返回地址和一些额外的附加信息组成,在虚拟机中包含这些信息的帧称为“栈帧”
阅读全文
posted @
2016-11-18 00:24
kosamino
阅读(2083)
推荐(0) 编辑
6.HotSpot垃圾收集器
摘要:HotSpot JVM收集器 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。 并发和并行 先解释下什么是垃圾收集器的上下文语境中的并行和并发: 并行(Parallel):指多条垃圾收集器线程并行工作,但此时用户线程仍然处于等待
阅读全文
posted @
2016-11-16 23:31
kosamino
阅读(1992)
推荐(2) 编辑
5.HotSpot的算法实现
摘要:1.枚举根节点 在可达性分析中,可以作为GC Roots的节点有很多,但是现在很多应用仅仅方法区就有上百MB,如果逐个检查的话,效率就会变得不可接受。 而且,可达性分析必须在一个一致性的快照中进行-即整个分析期间,系统就像冻结了一样。否则如果一边分析,系统一边动态表化,得到的结果就没有准确性。这就导
阅读全文
posted @
2016-11-16 22:26
kosamino
阅读(1005)
推荐(0) 编辑
4.垃圾收集算法
摘要:1.标记-清除算法 对所有存活对象进行一次全局遍历来确定哪些对象可以回收,遍历的过程从根出发,找到所有可达对象,除此之外,其它不可达的对象就是垃圾对象,可被回收。整个过程分为两个阶段:标记阶段找到所有存活对象;清除阶段清除所有垃圾对象。 优点:采用的可达性分析算法,相比较引用计数算法,标记-清除算法
阅读全文
posted @
2016-11-16 21:59
kosamino
阅读(381)
推荐(0) 编辑
3.对象死亡标记
摘要:1.概述 Java内存运行时区域的各个部分里: 其中程序计数器、虚拟机栈、本地方法栈3各区域随线程而生,随线程而灭。栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。每个栈帧中分配多少内存基本上是在类结构定下来是就已知了,因此这几个区域的内存分配和回收都具备确定性,不需过多考虑。 而堆
阅读全文
posted @
2016-11-15 23:28
kosamino
阅读(472)
推荐(0) 编辑
2.Java对象创建
摘要:1. 对象的创建 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程,在类的加载检查通过后,接下来java虚拟机会为新生对象会在堆中划分出一定的内存。对象所需内
阅读全文
posted @
2016-11-15 21:33
kosamino
阅读(304)
推荐(1) 编辑
1.Java内存区域
摘要:Java虚拟机在执行java程序的过程中会把他管理的内存划分为若干个不同的数据区域各自用途、创建以及销毁时间各不相同。有的随着虚拟机进行的启动而存在,有的区域依赖于线程的启动和结束而建立以及销毁。如图: 1.程序计数器 Jvm将这个计数看作当前线程(意味着只能支持单线程)执行某条字节码的行号指示器,
阅读全文
posted @
2016-11-02 01:42
kosamino
阅读(514)
推荐(0) 编辑