垃圾回收器的实现:

1.让用户都暂停,不再产生垃圾,就去收集垃圾。新生代用复制算法清理垃圾,老生代用标记整理算法搜集垃圾。

优秀的算法:服务端默认是CMS收集器。

  1. %..jvm案例演示
  2. 内存:
  3. Jconsole的内存标签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(java堆和永久代)的变化趋势。
  4. 我们通过下面的一段代码体验一下它的监视功能。运行时设置的虚拟机参数为:-Xms100m -Xmx100m -XX:+UseSerialGC,这段代码的作用是以64kb/50毫秒的速度往java堆内存中填充数据。
  5. public class TestMemory {
  6. static class OOMObject {
  7. public byte[] placeholder = new byte[ * ];
  8. }
  9.  
  10. public static void fillHeap(int num) throws Exception {
  11. ArrayList<OOMObject> list = new ArrayList<OOMObject>();
  12. for (int i = ; i < num; i++) {
  13. Thread.sleep();
  14. list.add(new OOMObject());
  15. }
  16. System.gc();
  17. }
  18.  
  19. public static void main(String[] args) throws Exception {
  20. fillHeap();
  21. Thread.sleep();
  22. }
  23. }

  1. 从图中可以看出,运行轨迹成曲线增长,循环1000次后,虽然整个新生代EdenSurvivor区都基本上被清空了,但是老年代仍然保持峰值状态,这说明,填充的数据在GC后仍然存活,因为list的作用域没有结束。如果把System.gc();移到fillHeap();后,就可以全部回收掉。
  2. 线程:
  3. jconsole线程标签相当于可视化了jstack命令,遇到线程停顿时,可以使用这个也签进行监控分析。线程长时间停顿的主要原因有:等待外部资源(数据库连接等),死循环、锁等待。下面的代码将演示这几种情况:
  4. package cn.java.jvm;
  5.  
  6. import java.io.BufferedReader;
  7. import java.io.IOException;
  8. import java.io.InputStreamReader;
  9.  
  10. public class TestThread {
  11. /**
  12. * 死循环演示
  13. *
  14. * @param args
  15. */
  16. public static void createBusyThread() {
  17. Thread thread = new Thread(new Runnable() {
  18. @Override
  19. public void run() {
  20. System.out.println("createBusyThread");
  21. while (true)
  22. ;
  23. }
  24. }, "testBusyThread");
  25. thread.start();
  26. }
  27.  
  28. /**
  29. * 线程锁等待
  30. *
  31. * @param args
  32. */
  33. public static void createLockThread(final Object lock) {
  34. Thread thread = new Thread(new Runnable() {
  35. @Override
  36. public void run() {
  37. System.out.println("createLockThread");
  38. synchronized (lock) {
  39. try {
  40. lock.wait();
  41. } catch (InterruptedException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. }
  47. }, "testLockThread");
  48. thread.start();
  49. }
  50.  
  51. public static void main(String[] args) throws Exception {
  52. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  53. br.readLine();
  54. createBusyThread();
  55. br.readLine();
  56. Object object = new Object();
  57. createLockThread(object);
  58. }
  59. }
  1. main线程:追踪到需要键盘录入
  2. testBusyThread线程:线程阻塞在18行的whiletrue),直到线程切换,很耗性能
  3. testLockThread线程:出于waitting状态,等待notify
  4.  
  5. 死锁:
  6. package cn.java.jvm;
  7.  
  8. public class TestDeadThread implements Runnable {
  9. int a, b;
  10.  
  11. public TestDeadThread(int a, int b) {
  12. this.a = a;
  13. this.b = b;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. System.out.println("createDeadThread");
  19. synchronized (Integer.valueOf(a)) {
  20. synchronized (Integer.valueOf(b)) {
  21. System.out.println(a + b);
  22. }
  23. }
  24. }
  25.  
  26. public static void main(String[] args) {
  27. for (int i = ; i < ; i++) {
  28. new Thread(new TestDeadThread(, )).start();
  29. new Thread(new TestDeadThread(, )).start();
  30. }
  31. }
  32. }

Jconsole点击检查死锁,会出现死锁的详情。

thread-5的锁被thread-10持有,相反亦是,造成死锁。

jvm2的更多相关文章

  1. jvm--2.类加载机制

    3.JVM类加载机制 (1)类加载机制 虚拟机把描述类的数据从Class文件,用ClassLoader ,加载到内存,并对数据进行校验.转换解析和初始化,最终形成虚拟机直接使用的java类型, 这就是 ...

  2. JVM-2.Class文件结构

    1.Class文件 (1)无关性:除了平台无关性,JVM还支持语言无关性:目前Clojure.Groovy.JRuby.Jyphon.Scala等语言可以在JVM上运行.实现语言无关性的原理仍然是字节 ...

  3. [JVM-2]常用JVM命令参数

    (1)-Xms20M 表示设置JVM堆内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM堆内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM内存 ...

  4. 理解JVM2 栈内存,方法区,堆内存

    堆,方法区,栈的关系 分配最大堆内存-Xmx32m class SimpleHeap(val id: Int){ fun show() = println("My id is $id&quo ...

  5. 深入理解JVM2

    1 JVM简介 VM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. ...

  6. JVM2 类加载子系统

    目录 类加载子系统 类加载器子系统 类加载器ClassLoader角色 类加载的过程 案例 加载Loading 连接Linking 初始化Intialization clinit() 类的加载器 虚拟 ...

  7. (转)Apache实现反向代理负载均衡

    说到负载均衡LVS这套技术,有很多种实现方法. 本文所说,主要就是利用apache服务器实现反向代理,实现负载均衡. 首先,传统的正向代理如下图所示,正如我们用的游戏加速代理,大多的个人PC把请求发给 ...

  8. No.1 CAS 之LDAP认证服务端集群配置

    建档日期:   2016/08/31 最后修改日期:   2016/12/09   1 概述 本文描述了CAS单点登录服务端配置的大概流程,希望抛砖引玉,帮助你完成CAS服务端的配置. 本文采用apa ...

  9. java回顾rmi

    搞java的不懂rmi好像说不过去.. ,复习一遍. 参照http://www.iteye.com/topic/173909 http://lzj0470.iteye.com/blog/426760  ...

随机推荐

  1. Myeclipse下使用Maven搭建spring boot项目

    开发环境:Myeclipse2017.JDK1.6.Tomcat 8.0.Myeclipse下使用Maven搭建spring boot项目,详细过程如下: 1. New -> Project.. ...

  2. Excel单元格格式设置

    工作中遇到一些小问题: 例如办公自动化里的如何设置单元格格式 此格式分为两种:一种是样式上的格式 比如边框 行距字体等 第二种为数据格式: 比如每次我输入1000的话自动变红或者加粗字体 office ...

  3. 报错分析---->jsp自定义标签:Unable to load tag handler class

    Unable to load tag handler class 无法加载标签处理程序类 处理自定义标签的类中如下: 调用自定义标签的jsp中如下:

  4. MongoDB 使用 ObjectId 代替时间

    An ObjectId is a 12-byte unique identifier consisting of: a 4-byte value representing the seconds si ...

  5. Java8 新特性之Lambda表达式

    1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...

  6. CF #301 A :Combination Lock(简单循环)

    A :Combination Lock 题意就是有一个密码箱,密码是n位数,现在有一个当前箱子上显示密码A和正确密码B,求有A到B一共至少需要滚动几次: 简单循环:

  7. 如何使文本溢出边界不换行强制在一行内显示?#test{width:150px;white-space:nowrap;}

    #test{width:150px;white-space:nowrap;}

  8. 关于DOM事件操作

    事件的三要素: 事件源.事件.事件驱动程序. 事件源.: 引发后续事件的html标签   document.getElementById(“box”) document.getElementsByCl ...

  9. Django自定义模板函数

    Django自定义模板函数 https://www.cnblogs.com/SunsetSunrise/p/7680491.html 在django中新建一个应用:listpage在listpage中 ...

  10. 2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascrip版)

    一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...