JVM
文章平均质量分 75
JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM是指解释和执行Java字节码的程序,其中Java字节码由Java编译器生成。
y_bccl27
这个作者很懒,什么都没留下…
展开
-
JVM介绍
Java相比C/C++最显著的特点便是引入了自动垃圾回收(也就是GC),它解决了C/C++最令人头疼的内存管理问题,让程序员专注于程序本身,不用关心内存回收这些恼人的问题,这也是Java能大行其道的重要原因之一。GC真正让程序员的生产力得到了释放,但是程序员很难感知到它的存在,这就好比,我们吃完饭后在桌上放下餐盘即走,服务员会替你收拾好这些餐盘,你不会关心服务员什么时候来收,怎么收。有人说既然GC己经自动完成了清理,不了解GC貌似也没哈问题。在大多数情况下确实没问题,不过如,涉及到一些性能调优,问题排查等,原创 2020-04-13 08:14:48 · 185 阅读 · 0 评论 -
如何识别垃圾
前面描述了JVM的内存区域,知道了GC主要发生在堆,那么GC该怎么判断堆中的对象实例或数据是不是垃圾呢,或者说判断某些数据是否是垃圾的方法有哪些。最容易想到的一种方式是引用计数法,啥叫引用计数法,简单地说,就是对象被引用一次,在它的对象头上加一次引用次数,如果没有被引用(引用次数为0),则此对象可回收以上代码ref 引用了右侧定义的对象,所以引用次数是1: 如果在上述代码后面添加一个ref = null,则由于对象没被引用,引用次数置为0,由于不被任何变量引用,此时即被回收,如下图所示:看起来用引用计原创 2022-07-07 22:55:15 · 305 阅读 · 0 评论 -
垃圾回收主要方法
前面已经知道了可以通过可达性算法来识别哪些数据是垃圾,那该怎么对这些垃圾进行回收呢?主要有以下几种方式:步骤比较简单,就以下两步:操作起来确实很简单,也不用做移动数据的操作,那有啥问题呢?仔细看上图,没错,内存碎片!假如我们想在上图中的堆中分配一块需要连续内存占用4M或5M的区域,显然是会失败,怎么解决呢,如果能把上面未使用的2M、2M、1M内存能连起来就能连成一片可用空间为5M的区域即可,怎么做呢?把堆等分成两块区域A和B,区域A负责分配对象,区域B不分配,对区域A使用以上所说的标记法把存活的对象标记出来原创 2022-07-12 20:50:02 · 206 阅读 · 0 评论 -
垃圾收集器种类
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java虚拟机规范并没有规定垃圾收集器应该如何实现,因此一般来说不同厂商,不同版本的虚拟机提供的垃圾收集器实现可能会有差别,一般会给出参数来让用户根据应用的特点来组合各个年代使用的收集器,主要有以下垃圾收集器:Serial收集器是工作在新生代的,单线程的垃圾收集器,单线程意味着它只会使用一个CPU或一个收集线程来完成垃圾回收,不仅如此,还记得我们上文提到的STW了吗,它在进行垃圾收集时,其他用户线程会暂停,直到垃圾收集结束,也就是说在G原创 2022-07-12 22:28:54 · 212 阅读 · 0 评论 -
什么是内存溢出
内存溢出(OutOfMemory)是指JVM可用内存不足。JVM运行需要使用的内存超出最大可用值,会导致JVM出现异常。当循环跑了33863次以后,就抛出了一个StackOverflowError的异常,也就是栈溢出。原创 2022-07-15 22:28:31 · 1741 阅读 · 0 评论 -
如何排查OOM的问题?
OOM:OutOfMemory,当JVM中内存不够并且垃圾回收的速度跟不上内存的分配速度,就会发生OOM的现象。为了演示出OOM现象,我们先构建一段代码如下所示:然后在IDEA开发工具中,设置堆空间的初始值大小和最大值大小为30MB:运行上述代码,可以看到控制台中报“内存溢出”错误:............原创 2022-07-13 21:14:20 · 507 阅读 · 0 评论 -
一个Java对象到底有多大?
ObjectHeader占4byte,ClassPointer占4byte,一个int字段(size)占4byte,elementData数组本身占12(4+4+4)byte,elementData数组中有10个Integer对象占10×16,即整个集合空间大小4+4+4+12+160=184byte。一个long比一个int才多4byte,但是你要想,如果内存中有100W个long,那就白白浪费了约4MB空间,不要小看这一点点的空间浪费,因为随便一个跑着在线应用的JMM中,对象都能达到上千万!......原创 2022-07-14 21:43:05 · 345 阅读 · 0 评论 -
String类的equals()与==的区别
JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间——字符串实例池。1.String赋值的两种方式第一种:String str = "test";以这种方式赋值时,JVM会先从字符串实例池中查询是否存在"test"这个对象。如果存在,直接把实例池中"test"的地址返回给str;如果不存在,则会在实例池中创建"test"对象,并把该对象的地址返回给str。.........原创 2022-03-22 17:50:10 · 125 阅读 · 0 评论 -
字符串在JVM中的内存分配
针对当前场景并没有在堆里面去创建这个一个oop对象,其余的是一样的,首先它会先去字符串常量池里面去找有没有String唯一的这么一个对象,如果没有的话,它就会创建这么一个HashTableEntry对象,然后oop的char数组指向这个真实的一个char数组的一个内存地址。String字符串不属于Java里面的这个八大数据类型,但是这个String字符串我们又经常去使用它,所以JVM就对它进行了这个优化,就是在内存里面开辟了一个空间,专门去优化这个String字符串,这个空间叫“.........原创 2022-07-19 22:28:44 · 452 阅读 · 0 评论 -
IDEA中如何给含有main方法的普通类设置JVM参数
问题描述:IDEA中如何给含有main方法的普通类设置JVM参数,并使其在运行解决方法:第一步:找到并选中含有main方法的普通类,然后单击鼠标右键选择“Run 'xxx.main()' ”这时在IDEA界面的右上角就会多了个一个可以启动的类名称第二步:选中我们想要测试的类,点击下方的这个下拉箭头,如果再点击“Edit Configurations...”第三步:在弹出框中的如下位置(VM options)处可以设置JVM参数...原创 2020-08-27 17:29:00 · 1626 阅读 · 0 评论 -
jmap监控工具
在一个JVM进程中会存在有多个对象实例,如果要想获取所有对象的信息,就可以通过JDK提供的jmap工具完成,另外使用该工具还可以直接获取到指定进程的堆内存使用信息。原创 2023-02-18 15:19:13 · 787 阅读 · 0 评论 -
jstack监控工具
在一个JVM进程中会存在有多个线程,但是一旦线程发生死锁,则很难进行问题的排查,所以在JDK中提供了一个jstack监控工具。原创 2023-02-18 19:17:04 · 172 阅读 · 0 评论 -
jstat监控工具
jstat(全称“Java Virtual Machine statistics monitoring tool”)是一个JDK自带的轻量级MM监控工具,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了堆内存的大小和垃圾回收状况的监控。原创 2023-02-19 11:16:50 · 510 阅读 · 0 评论 -
jvisualvm监控工具
VisualVM(All-in-One Java Troubleshooting Tool)是一款功能强大的运行监视和故障处理程序的可视化监控工具原创 2023-02-19 11:54:28 · 281 阅读 · 0 评论