jvm2
垃圾回收器的实现:
1.让用户都暂停,不再产生垃圾,就去收集垃圾。新生代用复制算法清理垃圾,老生代用标记整理算法搜集垃圾。
优秀的算法:服务端默认是CMS收集器。
- %..jvm案例演示
- 内存:
- Jconsole的内存标签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(java堆和永久代)的变化趋势。
- 我们通过下面的一段代码体验一下它的监视功能。运行时设置的虚拟机参数为:-Xms100m -Xmx100m -XX:+UseSerialGC,这段代码的作用是以64kb/50毫秒的速度往java堆内存中填充数据。
- public class TestMemory {
- static class OOMObject {
- public byte[] placeholder = new byte[ * ];
- }
- public static void fillHeap(int num) throws Exception {
- ArrayList<OOMObject> list = new ArrayList<OOMObject>();
- for (int i = ; i < num; i++) {
- Thread.sleep();
- list.add(new OOMObject());
- }
- System.gc();
- }
- public static void main(String[] args) throws Exception {
- fillHeap();
- Thread.sleep();
- }
- }
- 从图中可以看出,运行轨迹成曲线增长,循环1000次后,虽然整个新生代Eden和Survivor区都基本上被清空了,但是老年代仍然保持峰值状态,这说明,填充的数据在GC后仍然存活,因为list的作用域没有结束。如果把System.gc();移到fillHeap();后,就可以全部回收掉。
- 线程:
- jconsole线程标签相当于可视化了jstack命令,遇到线程停顿时,可以使用这个也签进行监控分析。线程长时间停顿的主要原因有:等待外部资源(数据库连接等),死循环、锁等待。下面的代码将演示这几种情况:
- package cn.java.jvm;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- public class TestThread {
- /**
- * 死循环演示
- *
- * @param args
- */
- public static void createBusyThread() {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println("createBusyThread");
- while (true)
- ;
- }
- }, "testBusyThread");
- thread.start();
- }
- /**
- * 线程锁等待
- *
- * @param args
- */
- public static void createLockThread(final Object lock) {
- Thread thread = new Thread(new Runnable() {
- @Override
- public void run() {
- System.out.println("createLockThread");
- synchronized (lock) {
- try {
- lock.wait();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }, "testLockThread");
- thread.start();
- }
- public static void main(String[] args) throws Exception {
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- br.readLine();
- createBusyThread();
- br.readLine();
- Object object = new Object();
- createLockThread(object);
- }
- }
- main线程:追踪到需要键盘录入
- testBusyThread线程:线程阻塞在18行的while(true),直到线程切换,很耗性能
- testLockThread线程:出于waitting状态,等待notify
- 死锁:
- package cn.java.jvm;
- public class TestDeadThread implements Runnable {
- int a, b;
- public TestDeadThread(int a, int b) {
- this.a = a;
- this.b = b;
- }
- @Override
- public void run() {
- System.out.println("createDeadThread");
- synchronized (Integer.valueOf(a)) {
- synchronized (Integer.valueOf(b)) {
- System.out.println(a + b);
- }
- }
- }
- public static void main(String[] args) {
- for (int i = ; i < ; i++) {
- new Thread(new TestDeadThread(, )).start();
- new Thread(new TestDeadThread(, )).start();
- }
- }
- }
Jconsole点击检查死锁,会出现死锁的详情。
thread-5的锁被thread-10持有,相反亦是,造成死锁。
jvm2的更多相关文章
- jvm--2.类加载机制
3.JVM类加载机制 (1)类加载机制 虚拟机把描述类的数据从Class文件,用ClassLoader ,加载到内存,并对数据进行校验.转换解析和初始化,最终形成虚拟机直接使用的java类型, 这就是 ...
- JVM-2.Class文件结构
1.Class文件 (1)无关性:除了平台无关性,JVM还支持语言无关性:目前Clojure.Groovy.JRuby.Jyphon.Scala等语言可以在JVM上运行.实现语言无关性的原理仍然是字节 ...
- [JVM-2]常用JVM命令参数
(1)-Xms20M 表示设置JVM堆内存的最小值为20M,必须以M为单位 (2)-Xmx20M 表示设置JVM堆内存的最大值为20M,必须以M为单位.将-Xmx和-Xms设置为一样可以避免JVM内存 ...
- 理解JVM2 栈内存,方法区,堆内存
堆,方法区,栈的关系 分配最大堆内存-Xmx32m class SimpleHeap(val id: Int){ fun show() = println("My id is $id&quo ...
- 深入理解JVM2
1 JVM简介 VM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的. ...
- JVM2 类加载子系统
目录 类加载子系统 类加载器子系统 类加载器ClassLoader角色 类加载的过程 案例 加载Loading 连接Linking 初始化Intialization clinit() 类的加载器 虚拟 ...
- (转)Apache实现反向代理负载均衡
说到负载均衡LVS这套技术,有很多种实现方法. 本文所说,主要就是利用apache服务器实现反向代理,实现负载均衡. 首先,传统的正向代理如下图所示,正如我们用的游戏加速代理,大多的个人PC把请求发给 ...
- No.1 CAS 之LDAP认证服务端集群配置
建档日期: 2016/08/31 最后修改日期: 2016/12/09 1 概述 本文描述了CAS单点登录服务端配置的大概流程,希望抛砖引玉,帮助你完成CAS服务端的配置. 本文采用apa ...
- java回顾rmi
搞java的不懂rmi好像说不过去.. ,复习一遍. 参照http://www.iteye.com/topic/173909 http://lzj0470.iteye.com/blog/426760 ...
随机推荐
- Myeclipse下使用Maven搭建spring boot项目
开发环境:Myeclipse2017.JDK1.6.Tomcat 8.0.Myeclipse下使用Maven搭建spring boot项目,详细过程如下: 1. New -> Project.. ...
- Excel单元格格式设置
工作中遇到一些小问题: 例如办公自动化里的如何设置单元格格式 此格式分为两种:一种是样式上的格式 比如边框 行距字体等 第二种为数据格式: 比如每次我输入1000的话自动变红或者加粗字体 office ...
- 报错分析---->jsp自定义标签:Unable to load tag handler class
Unable to load tag handler class 无法加载标签处理程序类 处理自定义标签的类中如下: 调用自定义标签的jsp中如下:
- MongoDB 使用 ObjectId 代替时间
An ObjectId is a 12-byte unique identifier consisting of: a 4-byte value representing the seconds si ...
- Java8 新特性之Lambda表达式
1. Lambda 表达式概述 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递); Lambda 表达式可以写出更简洁,更灵活的代码 ...
- CF #301 A :Combination Lock(简单循环)
A :Combination Lock 题意就是有一个密码箱,密码是n位数,现在有一个当前箱子上显示密码A和正确密码B,求有A到B一共至少需要滚动几次: 简单循环:
- 如何使文本溢出边界不换行强制在一行内显示?#test{width:150px;white-space:nowrap;}
#test{width:150px;white-space:nowrap;}
- 关于DOM事件操作
事件的三要素: 事件源.事件.事件驱动程序. 事件源.: 引发后续事件的html标签 document.getElementById(“box”) document.getElementsByCl ...
- Django自定义模板函数
Django自定义模板函数 https://www.cnblogs.com/SunsetSunrise/p/7680491.html 在django中新建一个应用:listpage在listpage中 ...
- 2D游戏中的碰撞检测:圆形与矩形碰撞检测(Javascrip版)
一,原理介绍 这回有点复杂,不过看懂了还是很好理解的.当然,我不敢保证这种算法在任何情况下都会起效果,如果有同学测试时,发现出现错误,请及时联系我. 我们首先来建立一个以圆心为原点的坐标系: 然后要检 ...