深入了解JAVA虚拟机
文章平均质量分 62
暮色恍然
这个作者很懒,什么都没留下…
展开
-
4.java虚拟机内存区域
java虚拟机会把内存分为以下几个区域:运行时数据区:方法区虚拟机栈本地方法栈堆程序计数器其中方法区和堆所有线程共享程序计数器每个线程各有一个程序计数器,相互独立,可以看做是当前线程所执行的字节码的行号指示器,字节码解释器通过改变该计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都依赖计数器实现。如果线程正在执行java方法,计数器记录的是...原创 2018-11-29 18:34:39 · 103 阅读 · 0 评论 -
11.内存回收的具体实现——垃圾收集器
1.Serial收集器最基本的垃圾收集器,一种单线程收集器,在GC时必须STW缺点:必须STW,并且STW时间占比太高优点:简单高效(与其他垃圾收集器的单线程模式相比)对于桌面应用在虚拟机中使用的只有几十兆乃至一两百兆的新生代内存来说,stw的停顿时间在最多一百毫秒以内,完全可以接受示例图:2.ParNew收集器是Serial的多线程版本参数,收集算法,STW对象分配规则...原创 2019-03-10 22:48:33 · 131 阅读 · 0 评论 -
12.内存分配和回收策略
通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的Eden上,如果启动了本地线程分配缓冲,讲按线程优先在TLAB上分配。少数情况下也是直接在老年代中分配。1.内存优先在Eden分配一般情况下对象都是优先分配在Eden上,当Eden没有足够的空间进行分配时,jvm会发起一次Minor GC。如果还是没有足够的空间分配,后面还有另外的措施,下面会提到。设置虚拟机的收集器日志参数-X...原创 2019-03-15 01:51:43 · 174 阅读 · 0 评论 -
10.hopspot如何安全的进行GC
HopSpot算法实现1.枚举根节点前文提过虚拟机通常采用可达性分析的算法来判断对象是否还存活在从gc root向下查找引用链时,可作为GC ROOT的节点主要在全局性引用(常量、静态变量)和执行上下文(栈帧中的本地变量表),通常方法区就有数百兆,逐个检查消耗会很大因为可达性分析必须在一个能够保证一致性的快照中进行,所以在进行枚举根节点时必须STW(停止所有线程)来进行可靠的可达性分析,因...原创 2019-02-26 08:33:54 · 267 阅读 · 0 评论 -
8.GC的工作范围与算法的选择
1.GC工作的范围帧栈分配的内存基本在类结构确定下来时就已经已知,在这几个区域内的内存分配和回收都具备确定性,因此,在这几个区域内不必太多考虑回收的问题,因为方法结束或线程结束时,内存被自然的回收了,但堆和方法区中的内存并不一样,一个接口中多个实现类需要的内存也不一样,一个方法中的多个分支需要的内存也不一致,只有在runtime时才知道会创建哪些对象,这部分内存的分配和回收都是动态的,GC用于关...原创 2018-12-23 23:33:31 · 272 阅读 · 0 评论 -
9.垃圾回收算法
1. 标记清除算法Mark-Sweep算法首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象最基础的垃圾回收算法缺点效率不高产生大量不连续的内存碎片2.复制算法Copying算法为了解决效率问题出现把内存区域分成两块,只使用一块,满了之后把使用中的内存块中还存活的对象复制到另一块空白区去,然后把整块清除掉缺点代价太高,牺牲了一半的可用内存空间改进新生...原创 2018-12-27 23:59:53 · 91 阅读 · 0 评论 -
7.对象的内存信息
对象占据的内存区域大体可以分为三块,对象头,实例数据,和对齐填充hotspot里面的对象头包含两部分信息,第一是存储对象自身的运行时数据,如HashCode,GC分代,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等,这部分数据被称为markword,在32和64位虚拟机中分别占据32bit和64bit的内存,为了能在这么小的空间内存储足够的信息,实际上虚拟机会采用非固定的数据结构存储这些信...原创 2018-12-16 22:04:05 · 115 阅读 · 0 评论 -
5.指针碰撞与空闲列表,CMS与其他GC对比
new对象时堆内存的分配方式有两种模式,指针碰撞把指针向空闲对象移动与对象占用内存大小相等的距离空闲列表虚拟机维护一个列表,记录可用的内存块,分配给对象列表中一块足够大的内存空间显然,采用何种方式要基于虚拟机堆内存是否规整,这又由采用的垃圾收集器是否带有压缩整理功能决定,所以类似Serial、ParNes等收集器时采用指针碰撞,而采用CMS这种基于Mark-Sweep算法的收集器时采用空...原创 2018-12-07 15:37:43 · 3695 阅读 · 0 评论 -
6.关键字new的执行过程
java代码编写如下代码,new一个对象public class test { public static void main(String[] args) { Person p = new Person("liming"); System.out.println(p); }}class Person { String name; public Person(Strin...原创 2018-12-07 18:36:43 · 693 阅读 · 0 评论 -
3.netbeans下启动hotspot项目
续博文:https://blog.csdn.net/qq_24516549/article/details/84569077右键项目设置属性,如下运行命令:/jvm/jdk7u-dev/hotspot/build/linux/linux_amd64_compiler2/jvmg/gamma Queens运行目录:/jvm/jdk7u-dev/hotspot/build/linux/...原创 2018-11-28 12:56:30 · 188 阅读 · 0 评论 -
2.在centos上安装netbeans并导入hotspot项目
准备工作在https://netbeans.org/downloads/上选择linux版本的g++版编译器下载,并安装编译jdk1.7见博文https://blog.csdn.net/qq_24516549/article/details/84538043导入项目新建项目,选择下一步,选择本地下载的源码中文件夹下一步,下一步,选择工作目录,清理命令和构建命令分别填写(...原创 2018-11-27 17:04:33 · 382 阅读 · 0 评论 -
1.编译JDK
linux环境下编译jdk7u-dev系统版本:CentOS Linux release 7.3.1611 (Core)CPU:1 Intel® Xeon® CPU E5-26xx v4步骤:准备工作:安装依赖:yum install -y mercurialyum install -y ant ant-nodepsyum install -y libX11* libX*y...原创 2018-11-26 13:30:04 · 253 阅读 · 2 评论 -
13.jdk的命令行工具
1.jps:虚拟机进程状况工具jps(JVM Process Status Tool),有点像linux的ps命令,通过这个命令你可以查看执行类的名称以及这些进程在本地虚拟机中对应的唯一ID(Local Virtual Machine Identifier, LVMID)。对于本地虚拟机来讲,LVMID与PID是一致的。一般用jps -l -m即可,查看启动的jar包的pid和端口号2.j...原创 2019-03-19 01:50:55 · 267 阅读 · 0 评论