一篇讲解Java内存模型的文章,通俗简要说明了多线程编码所面临的问题和什么是JMM。
从mysql到mongodb你应该快速了解的内容
从关系型数据库突然转战到Mongodb最开始很是不习惯,但是好在官网的文档写得也挺详细的,一个数据库最重要的什么?当然是增删改查了,所以只要掌握了增删改查就可以解决平时80%的问题了,本文就抛砖引玉快速的学习下mongodb的使用。
关于锁使用的补充说明
在涉及到临界区的时候,就不得到谈到synchronized,又不得不谈到notify,这个也是对锁的优化那一章的一些补充说明。
java中锁的优化
多线程编码中,我们常用到synchronized关键字,都知道它是加锁关键字,也或多或少听说过轻量级锁,重量级锁,偏向锁这些关键字,可是我们知道这些具体指的是什么吗?为了我们更优的使用,JVM团队在背后做了多少努力?
关于wait,notify,join,sleep的用法说明
一说到多线程,那么必然离不开Object中的wait,notify,notifyAll,join以及Thread中的sleep等方法,虽然这些是耳熟能详,但是你真的会用吗?你知道如何使用吗?你知道这里面涉及到的知识点吗?
从Eclipse到Idea,常用的快捷键
从Eclipse转到Idea,多多少少会有些不习惯,虽然可以使用Eclipse的快捷键,但是开发中总是会在别人的机器上或者别人在你的机器上调测,所以掌握Idea的快捷键很很有必要的,但是一般来说我们掌握常用的即可,其他的即使记不住也可以搜索。
Java开发者常用的线上命令
在开发过程中,遇到一些问题常常需要在Linux下进行定位分析,查看日志、分析堆栈情况、分析网络状况等,但是Linux系统下命令不胜繁多,这里总结了写自己在开发过程中常用的命令。
如何写出高效率的正则表达式
写出高效的正则表达式应该注意什么,一篇文章再次回顾
正则表达式基本使用
关于正则表达式的基本使用
关于GC参数的一个问题
我遇到一个一个问题
我遇到了一个问题,这个问题真的很难,我想说在国内去关注这个问题的人应该并不多,至少我问了很多人但是他们并没有去深究这个问题,不过既然让我发现了这个问题那么我肯定不能带着疑惑离开,我必须得留下点什么,所以我解决了这个问题,然后写下了这篇博客,我都不知道应该怎么赞美自己了,好了不吹牛逼了。。。
这个问题是这样的,我们都知道可以设置VM参数来设置堆的大小,通过-Xmx设置堆的最大值,-Xms设置堆的最小值。然后虚拟机在启动的时候会根据我们的参数进行动态调整。但是这其中还是有点小秘密的。
我们在本地运行这样的一段代码:
1 | //VM Args:-Xms4m -Xmx4m -XX:+PrintGCDetails |
查看打印出来的的GC信息:
1 | [GC [PSYoungGen: 2344K->312K(2368K)] 2910K->1477K(5120K), 0.0083535 secs] [Times: user=0.05 sys=0.00, real=0.01 secs] |
发现了吧!堆的大小是5504(ParOldGen)+320(from)+320(to)+2048(eden) = 8192(8M),虽然我们设置的是4M,但是实际上却是8M?那么这个为什么了?我们的参数没有起作用?
和操作系统有关的VM
我们先看一个图,如图所示64位的windows系统是Server模式,而其默认的收集器是parallel scavenge。
为什么这个收集器就这么神奇呢?经过我的探索发现
1 | The problem is os::page_size_for_region, in particular the check: |
事情当然不会到了这里就结束。我们知道-XX:SurvivorRatio表示Eden区与Survivor区的大小比值,默认是8,也就是说eden:from=8,但是很明显我们打印出来的信息并不是这样,2048:320=6,那么这个8哪里来的呢?顿时我又崩溃了,还好经过我不管的查找资料,翻看JDK源码,发现了原来是是这样的
1 | // The survivor ratio's are calculated "raw", unlike the |
这里可以查看资料parallelScavenge中GenerationSize
你以为到了这里问题就完了吗?我告诉你并没有。
解决一个问题
我遇到这个问题的时候我也是很崩溃的,我先是翻阅书籍,然后发现没有,然后为群友,去社区提问题,还是没有能够解决这个问题。
但是我是谁呀!我没有放弃,没有得过起过,我还和你耗上了。然后我去翻阅官方文档,然后让我发现了这个client和server端的区别,是的之前我没有发现这个。然后官方文档上没接着说这些细节,然后我就去找源码呀!我看人家源码怎么说的呀,这样一层一层找下来,最终问题解决了。
虽然现在看来我写出来这个问题真的很小,可是在找问题的过程中确实花费了很多事件,但是这也锻炼了我解决问题的思维。
我的方法如下:
- 确定是自己配置不对还是自己理解有误
- 在1的基础上定位问题解决方向是寻找官方文档还是加深理解
- 找答案,做实验。
参考文档
- http://docs.oracle.com/javase/7/docs/technotes/guides/vm/server-class.html
- http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html
- http://www.oracle.com/technetwork/java/faq-140837.html
- https://bugs.openjdk.java.net/browse/JDK-4484370
- https://bugs.openjdk.java.net/browse/JDK-8027915
- https://searchcode.com/codesearch/view/17980811/