jvm笔记

root@mobile-site2:/data/logs/pay1.api.xxx.com# jmap -heap 8379
Attaching to process ID 8379, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 23.7-b01

using thread-local object allocation.
Parallel GC with 13 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 1073741824 (1024.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 134217728 (128.0MB)
   MaxPermSize      = 134217728 (128.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 348848128 (332.6875MB)
   used     = 194877664 (185.84982299804688MB)
   free     = 153970464 (146.83767700195312MB)
   55.863181814179036% used
From Space:
   capacity = 4390912 (4.1875MB)
   used     = 0 (0.0MB)
   free     = 4390912 (4.1875MB)
   0.0% used
To Space:
   capacity = 4521984 (4.3125MB)
   used     = 0 (0.0MB)
   free     = 4521984 (4.3125MB)
   0.0% used
PS Old Generation
   capacity = 715849728 (682.6875MB)
   used     = 30494688 (29.082000732421875MB)
   free     = 685355040 (653.6054992675781MB)
   4.259928698331502% used
PS Perm Generation
   capacity = 134217728 (128.0MB)
   used     = 45301880 (43.20323944091797MB)
   free     = 88915848 (84.79676055908203MB)
   33.75253081321716% used

20226 interned Strings occupying 2414832 bytes.

===============================================================
两次间隔12小时
^Croot@mobile-site1:/data/logs/pay1.api.xxx.com# jstat -gcutil 8533  1000 100     
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  61.76  84.46  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  84.46  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  84.61  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  88.24  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  89.61  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  89.61  10.44  41.00   5009   32.750   158   19.519   52.269
  0.00  61.76  94.61  10.44  41.00   5009   32.750   158   19.519   52.269
root@mobile-site1:/data/logs/pay1.api.xxx.com# jstat -gcutil 8533  1000 100
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 69.60   0.00  62.84   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  62.84   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  62.84   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  63.77   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  63.77   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  63.77   8.21  40.94   5142   33.704   168   20.788   54.492
 69.60   0.00  63.77   8.21  40.94   5142   33.704   168   20.788   54.492

结论:年轻代:984ms  12h 133 req 7.1723ms/per

结论:年老代:1269ms 12h 10  req 129.00ms/per



复制(Copying) 新生代
标记整理(Mark-Compact) 年老代
标记-清除(Mark-Sweep) 没有用

串行收集器:单核 小应用
并行收集器:吞吐量优先 吞吐量大,后台系统。般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象
并发收集器:中断优先,实时性高, 交易系统。并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。 花在年轻代和年老代回收上的时间比例 减少年轻代和年老代花费的时间,一般会提高应用的效率

并行:
jdk1.5年轻代默认 -XX:+UseParallelGC ,年老代只有:-XX:+UseSerialGC

jdk1.6年老代代支持,需设置 -XX:+UseParallelOldGC

 

串行 serial     -XX:+UseSerialGC:策略为年轻代串行复制,年老代串行标记整理


并发 parallel   -XX:+UseParallelGC:这是JDK5 -server的默认值。策略为:年轻代:暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数,CPU很多时,可用-XX:ParallelGCThreads= 设定线程数。年老代:暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。


并行 Concurrent -XX:+UseConcMarkSweepGC:这是以上两种策略的升级版,策略为:年轻代:同样是暂停应用程序,多个垃圾收集线程并行的复制收集。年老代:则只有两次短暂停,其他时间应用程序与收集线程并发的清除

 

 

使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。
  G1收集器之所以能建立可预测的停顿时间模型,是因为它可以有计划地避免在整个Java堆中进行全区域的垃圾收集。G1跟踪各个Region里面的垃圾堆积的价值大小(回收所获得的空间大小以及回收所需时间的经验值),在后台维护一个优先列表,每次根据允许的收集时间,优先回价值最大的Region(这也就是Garbage-First名称的来由)。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限的时间内获可以获取尽可能高的收集效率。G1把内存“化整为零”的思路.


 

 参数介绍:http://www.blogjava.net/chhbjh/archive/2012/01/28/368936.html

                  http://www.blogjava.net/bitbit/archive/2009/11/30/304247.html

                  http://blog.youkuaiyun.com/luyee2010/article/details/8666274

                  http://blog.youkuaiyun.com/luyee2010/article/details/8666274

                  http://developer.51cto.com/art/201311/417461.htm      jdk命令

                   http://zhanshenny.iteye.com/blog/1661962

                 http://blog.youkuaiyun.com/on_my_way20xx/article/details/8562055
                 http://blog.sina.com.cn/s/blog_6490ecfa01010b3q.html
                 http://my.oschina.net/u/565871/blog/183346



### 关于JVM的学习资源 对于希望深入学习 Java 虚拟机 (JVM) 的开发者来说,《黑马程序员 JVM 完整教程》是一份非常有价值的入门材料[^1]。这份笔记涵盖了 JVM 基础概念、内存模型以及性能调优等内容,适合初学者快速掌握 JVM 的核心知识点。 如果需要更深层次的理解,可以参考以下书籍: 1. **《深入理解 Java 虚拟机:Jvm 高级特性与最佳实践(第 2 版)》** 这本书详细讲解了 JVM 的内部机制,包括类加载过程、垃圾回收算法、性能优化策略等高级主题。它不仅提供了丰富的理论知识,还通过实际案例帮助读者解决常见的 JVM 性能问题。 2. **《实战 Java 虚拟机》** 此书侧重于 JVM 实战技巧,特别适用于那些希望通过真实项目经验提升技能的技术人员。书中包含大量实用工具和技术的应用场景分析。 3. **《深入 JAVA 虚拟机第二版》** 另一本经典著作,专注于 JVM 架构设计及其运行原理,能够为开发者的日常编码提供指导和支持。 除了上述书籍外,在线还有许多免费资源可供利用。例如官方文档总是最好的起点之一;另外像 Oracle 提供的各种技术白皮书也是不可多得的好资料。 需要注意的是,当涉及到并发编程时,了解重排序现象非常重要。因为即使代码按特定顺序编写出来,编译器或者处理器为了提高效率可能会改变它们的实际执行次序——只要这种变化不会影响单线程环境下的最终结果即可[^2]。 至于方法实现方面,则需确保函数签名中的返回类型同其逻辑体内的最后一句`return`表达式的类别相一致。否则将会引发编译错误[^3]。 以下是基于这些原则的一个简单示例展示如何判断一个数是否偶数并找出两个数值之间的较大者: ```java public class Example { public static void main(String[] args){ System.out.println(isEvenNumber(4)); // 输出true System.out.println(getMax(8,5)); // 输出8 } public static boolean isEvenNumber(int number ){ return ((number % 2)==0); } public static int getMax(int a,int b){ if(a>b) return a; else return b; } } ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值