JVM
K.Sun
这个作者很懒,什么都没留下…
展开
-
Java中的垃圾回收
原文地址:Garbage Collection in Java在C/C++中,如果一个对象不再适用了,那么码农有义务去删除动态分配的对象。在Java中,码农就不需要关心这些不再适用的对象。垃圾回收器会销毁这些对象,但是垃圾回收器不能保证在任何特定的时间都运行。一旦一个对象有了被垃圾回收的资格,那垃圾回收器在任何时间都可以运行。finalize()方法当垃圾回收器决定这个对象再没有引用的时候,那么针对翻译 2016-11-02 21:12:23 · 274 阅读 · 0 评论 -
可作为GC Root的对象
在Java虚拟机中判断一个对象是否可以被回收,有一种做法叫可达性分析算法,也就是从GC Root到各个对象,如果GC Root到某个对象还有可达的引用链,那么这个对象就还不能被回收,否则就等着被收割吧。这里既然提到了GC Root,那么哪类对象可以作为GC Root呢,这是一个在面试中经常被问到的问题。《深入理解Java虚拟机》一书中是这么说的,一下几种对象可以作为GC Root:虚拟机栈中的引用原创 2017-06-07 19:44:13 · 9151 阅读 · 0 评论 -
垃圾回收算法之复制算法
复制(Copying)算法说到底也是为了解决标记-清除算法产生的那些碎片。首先将内存分为大小相等的两部分(假设A、B两部分),每次呢只使用其中的一部分(这里我们假设为A区),等这部分用完了,这时候就将这里面还能活下来的对象复制到另一部分内存(这里设为B区)中,然后把A区中的剩下部分全部清理掉。这样一来每次清理都要对一半的内存进行回收操作,这样内存碎片的问题就解决了,可以说简单,高效。但是呢,肯定发现原创 2016-11-01 22:50:10 · 7040 阅读 · 6 评论 -
Java运行时数据区
在《Java虚拟机规范》中,将Java运行时数据区分为六个部分:PC计寄存器,Java虚拟机栈,Java堆,方法区,运行时常量池,本地方法栈。PC寄存器PC寄存器(Program Counter Register),在大学期间《计算机体系结构》这门课中有介绍过这个概念,简单地讲可以看做是指向当前执行指令的指示器,在Java虚拟机中,这个概念也类似,如果线程正在执行一个Java方法,那么它指向的正是这原创 2017-02-12 15:47:58 · 504 阅读 · 0 评论 -
JVM架构之JVM工作原理
原文地址:How JVM Works – JVM Architecture?JVM(Java Virtual Machine)是用来运行Java应用程序的运行时引擎(run-time engine)。JVM就是调用在Java代码中的main方法。JVM是JRE(Java Run Environment)的一部分。Java应用程序号称“一次写好,处处运行”。这就是说码农可以在一个机器上写好Java代码翻译 2016-11-02 16:55:23 · 335 阅读 · 0 评论 -
垃圾回收算法之分代回收算法
当前商业虚拟机基本上都是采用分代垃圾回收算法来回收垃圾,思想也很简单,就是根据对象的生命周期将内存划分,然后进行分区管理。在Java虚拟机分代垃圾回收机制中,应用程序可用的堆空间可以分为年轻代与老年代,然后呢,年亲代有被分为Eden区,From区与To区。当系统创建一个对象的时候,总是在Eden区操作,当这个区满了,那么就会触发一次YoungGC,也就是年轻代的垃圾回收。一般来说这时候不是所有的对象原创 2016-11-01 20:23:11 · 8844 阅读 · 7 评论 -
垃圾回收算法之标记-清除算法
标记-清除(Mark-Sweep)算法顾名思义,主要就是两个动作,一个是标记,另一个就是清除。标记就是根据特定的算法(如:引用计数算法,可达性分析算法等)标出内存中哪些对象可以回收,哪些对象还要继续用。标记指示回收,那就直接收掉;标记指示对象还能用,那就原地不动留下。缺点标记与清除效率低;清除之后内存会产生大量碎片;原创 2016-11-01 21:25:30 · 2097 阅读 · 0 评论 -
Java中的隔离岛
原文地址:Island of Isolation in Java在Java中,对象的析构只有垃圾回收模块关心,那些没有引用的对象正受垃圾回收中意。垃圾回收器可以识别这类对象。隔离岛Object1引用Object2,Object2引用Object1。要么Object1被其他对象引用,要么Object2倍其他对象引用。这就是隔离岛(Island of Isolation)。一般而言,隔离岛是一组对象翻译 2016-11-27 18:27:09 · 542 阅读 · 0 评论 -
StackOverflowError与OutOfMemoryError区别
在Java虚拟机规范中,定义了这么两种异常:StackOverflowError与OutOfMemoryError。那么它们到底直接有啥区别呢?在《The Java ® Virtual Machine Specification Java SE 8 Edition》中是这么说的: The following exceptional conditions are associated with n原创 2016-12-05 14:53:24 · 8014 阅读 · 4 评论 -
Java 类的热替换 —— 概念、设计与实现
原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/index.html构建基于 Java 的在线升级系统对于许多关键性业务或者庞大的 Java 系统来说,如果必须暂停系统服务才能进行系统升级,既会大大影响到系统的可用性,同时也增加了系统的管理和维护成本。因此,如果能够方便地在不停止系统业务的情况下进行系统升级,则可以很好地解转载 2016-11-21 22:58:53 · 227 阅读 · 0 评论 -
Java虚拟机工具之虚拟机统计监控工具jstat
jstat,全程是JVM Statistics Monitor Tool,主要用于监视虚拟机运行状态信息jstat的命令格式是这样的:jstat [ generalOption | outputOptions vmid [ interval[s|ms] [ count ] ]原创 2016-11-02 10:49:19 · 545 阅读 · 0 评论 -
Java虚拟机工具之虚拟机进程状况工具jps
jps(JVM Process Status Tool),有点像linux的ps命令,通过这个命令你可以查看执行类的名称以及这些进程在本地虚拟机中对应的唯一ID(Local Virtual Machine Identifier, LVMID)。对于本地虚拟机来讲,LVMID与PID是一致的。该工具很简单,但是使用很频繁,这个工具在很多时候是使用其他工具的前提,废话少说,直接看示例:kevin@kev原创 2016-11-02 10:31:18 · 1488 阅读 · 0 评论 -
垃圾回收算法之标记-整理算法
标记-清除算法会使内存产生碎片,那么如何解决这个问题,很显然,清除以后再整理一下内存不就行了么。然而标记-整理算法不是简单滴整理一下内存。标记-整理(Mark-Compact)算法不直接对可回收对象进行清理,而是让所有可用的对象都向一端移动。然后直接清理掉边界意外的内存。很显然,整理这一下需要时间,所以与标记清除算法相比,这一步花费了不少时间,但从长远来看,这一步还是很有必要的。该算法可谓“道德高尚原创 2016-11-01 22:16:02 · 5274 阅读 · 0 评论 -
Windows下Jconsole无法连接到进程
Jconsole是JDK提供给我们一种十分常用的工具,它将一些关于JVM的文本数据图形化,使得用户对JVM的监控更直观。但是有时会出现Jconsole无法连接到进程的情况,这是因为JVM在启动的时候默认加载参数没有进行设置,所以只要我们队JVM的启动参数进行恰当的配置就行了。启动参数在哪里设置,请参考设置tomcat启动参数 添加启动参数-Dcom.sun.management.jmxremote原创 2016-11-07 18:23:44 · 8054 阅读 · 0 评论 -
Java虚拟机工具之堆栈跟踪工具jstack定位死循环
jstack命令用于打印Java进程,core文件或者远程调试服务器的堆栈跟踪记录,它会打印类名,方法名,字节码索引(BCI),如果允许的话,还会打印出行号。jstack主要用于生成线程快照,这样可以定位长时间停顿的原因,比如死锁或者死循环。jstack的命令格式jstack [ options ] pid我在代码里特意写了个死循环,代码如下:/** * Created by kevin on 1原创 2016-11-04 16:40:04 · 4374 阅读 · 0 评论 -
Java虚拟机工具之堆栈跟踪工具jstack检测死锁
jstack是一个很实用的工具,不仅能定位到死循环的位置,还能找到死锁的位置,这个工具对我们直接在生产机上定位错误带来了极大的方便,尤其是那些不容易复现的错误。首先呢,先写一个能产生死锁的代码。代码逻辑很简单,咱就产生两个线程,两个线程分别执行加锁与放锁两个动作,啥时候产生死锁呢,就是在两个线程都释放锁以后,又同时加锁,于是互相僵持,互相等待,产生死锁。import java.util.concur原创 2016-11-07 15:21:09 · 3834 阅读 · 0 评论 -
Java虚拟机工具之堆栈跟踪工具jstack检测输入等待
当代码运行到有输入的时候,毫无疑问执行会停下来,然后监听键盘时间,然后将键盘输入的字符放到变量中,jstack可以检测这样的有输入的代码比较简单:import java.util.Scanner;public class InputWait { public static void main(String[] args) { Scanner s = new Scanner(S原创 2016-11-07 15:59:06 · 847 阅读 · 0 评论 -
Java虚拟机工具之堆栈跟踪工具jstack检测对象wait方法
wait()方法源于Object类,当线程调用wait的时候,意思就是说线程会放弃对象锁,进入等待此对象的等待锁定池。下面看看用jstack怎么定位wait方法。首先写一段简单的调用wait的代码:import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class WaitTask impl原创 2016-11-07 16:44:31 · 2761 阅读 · 0 评论 -
设置tomcat启动参数
Linux在修改启动参数前先看下tomcat默认启动参数是啥玩意,这样是为了下面方便进行对比:$ jps -v32136 Jps -Denv.class.path=.:/usr/java/jdk1.8.0_101/lib/dt.jar:/usr/java/jdk1.8.0_101/lib/tools.jar -Dapplication.home=/usr/java/jdk1.8.0_101 -Xm原创 2016-11-07 18:54:17 · 34540 阅读 · 1 评论