- 浏览: 7935489 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
1 jps -l //列出详细的类名和进程ID
2)jps -m // 显示运行的程序接收的参数
3)jps -v //查看接收的JVM方面的参数
4)jps 先查出进程ID后
jstat -gcutil pid 1000 10 //每隔离1000毫秒打印,搞10次
jstaat -gcnew pid //显示新生代情况
D:\PSTools>jstat -gcnew 5328
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
62976.0 58368.0 0.0 42323.6 14 15 62976.0 199168.0 106984.4 177 5.470
显示列名
具体描述
S0C
年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
年轻代中第二个survivor(幸存区)的容量 (字节)
S0U
年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U
年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC
年轻代中Eden(伊甸园)的容量 (字节)
EU
年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC
Old代的容量 (字节)
OU
Old代目前已使用空间 (字节)
PC
Perm(持久代)的容量 (字节)
------------------------------------------------------
jstat -gcutil <pid>:统计gc信息
其中:
S0
年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1
年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E
年轻代中Eden(伊甸园)已使用的占当前容量百分比
O
old代已使用的占当前容量百分比
P
perm代已使用的占当前容量百分比
YGC
从应用程序启动到采样时年轻代中gc次数
YGCT
从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
-------------
jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
显示列名
具体描述
NGCMN
年轻代(young)中初始化(最小)的大小(字节)
NGCMX
年轻代(young)的最大容量 (字节)
NGC
年轻代(young)中当前的容量 (字节)
S0C
年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
年轻代中第二个survivor(幸存区)的容量 (字节)
EC
年轻代中Eden(伊甸园)的容量 (字节)
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量(字节)
OGC
old代当前新生成的容量 (字节)
OC
Old代的容量 (字节)
PGCMN
perm代中初始化(最小)的大小 (字节)
PGCMX
perm代的最大容量 (字节)
PGC
perm代当前新生成的容量 (字节)
PC
Perm(持久代)的容量 (字节)
YGC
从应用程序启动到采样时年轻代中gc次数
FGC
从应用程序启动到采样时old代(全gc)gc次数
---------------------------------------
jstat -gcoldcapacity <pid>: old代对象的信息及其占用量
显示列名
具体描述
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量(字节)
OGC
old代当前新生成的容量 (字节)
OC
Old代的容量 (字节)
YGC
从应用程序启动到采样时年轻代中gc次数
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
5)jinfo opiton pid
jinfo -flag pid //查看某个进程用的GC,比如
、jinfo -flg UseSericGC PID
在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable
intx CMSAbortablePrecleanWaitMillis = 100 {manageable}
intx CMSWaitDuration = 2000 {manageable}
bool HeapDumpAfterFullGC = false {manageable}
bool HeapDumpBeforeFullGC = false {manageable}
bool HeapDumpOnOutOfMemoryError = false {manageable}
... cut for brevity ...
bool PrintGC = false {manageable}
bool PrintGCDateStamps = false {manageable}
bool PrintGCDetails = false {manageable}
bool PrintGCTimeStamps = false {manageable}
通过选项-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。
如何使用jinfo
让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:
my-precious me$ jps
12278 HighAllocationRate
12279 Jps
12269 JConsole
my-precious me$ jinfo -flag +PrintGCDetails 12278
my-precious me$ jinfo -flag +PrintGC 12278
my-precious me$
在jinfo中需要打开-XX:+PrintGC和 -XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup script)来设置参数,仅需-XX:+PrintGCDetails即可,因为-XX:+PrintGC会被自动打开。
不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:
...
[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs]
...
[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs]
...
同理,若想关闭GC日志功能,只需要执行jinfo -flag -PrintGCDetails 12278和 jinfo -flag -PrintGC 12278命令即可。
6)jmap -dump:format=b,file=c:\aaa.bin pid
dump 出内存相关再用eclipse mat去分析;
如果结果是+号,标识有用,否则无用
7)jhat对 JMAP DUMP出来的BIN文件进行分析
jhat d:\xxxx.bin
完了后用http://localhost:7000/ 查询
8)jstack -F //强制打印
jstack -m //打印JAVA和本地方法栈
jstack -l pid //打印包含锁的信息
9) -XX:+PrintClassHistogram
按下Ctrl+Break后,打印类的信息:
num #instances #bytes class name
----------------------------------------------
1: 890617 470266000 [B
2: 890643 21375432 java.util.HashMap$Node
3: 890608 14249728 java.lang.Long
4: 13 8389712 [Ljava.util.HashMap$Node;
5: 2062 371680 [C
6: 463 41904 java.lang.Class
分别显示:序号、实例数量、总大小、类型
10) -XX:+TraceClassLoading
监控类的加载
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
11) Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比
8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
12) -XX:+HeapDumpOnOutOfMemoryError
OOM时导出堆到文件
-XX:+HeapDumpPath
导出OOM的路径
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
13)
打印GC的简要信息–[GC 4790K->374K(15872K), 0.0001606 secs]–
[GC 4790K->374K(15872K), 0.0001474 secs]–
[GC 4790K->374K(15872K), 0.0001563 secs]–
[GC 4790K->374K(15872K), 0.000168
这里-XX:+PrintGC,在GC前,堆空间4MB,GC后,堆为374KB,括号内表示当前可用堆为16MB
更详细的,需要-XX:+PrintGCDetails 参数;
-XX:+PrintGCTimeStamps–打印CG发生的时间戳?例–
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs]
[Times: user=0.00 sys=0.00, real=0.00 se
-Xloggc:log/gc.log–指定GC log的位置,以文件输出–帮助开发人员分析问题
14) 可以设置-xms=-xmx,减少程序运行的时候垃圾回收次数,提高性能;
15) 堆的分配参数?-Xmn–设置新生代大小
?-XX:NewRatio–新生代(eden+2*s)和老年代(不包含永久区)的比值–4 表示 新生代:老年代=1:4=(老年代/新生代=-xx:NewRatio);
即年轻代占堆的1/5?
-XX:SurvivorRatio–设置两个Survivor区和eden的比–8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
16)-XX:MaxDirectoryMemorySize,NIO用的直接内存,不属于堆;
17)./java -server -version
为服务模式,启动慢,但尝试更多信息去调优JVM,64位一般都为SERVER模式
18)标记清除算法,会产生碎片,适合老年代;标记复制算法,分两部分空间,把存活的对象赶到另外一半空间中,然后清除其中的有碎片的空间,适合新生代,因为垃圾多;
标记压缩算法:不需要两个空间,通过可达性分析,找到存活对象,直接压缩到另外一半空间,然后再清除剩下的,适合老年代;
19) JAVA强引用,软引用,弱引用,虚引用
参考:
https://mp.weixin.qq.com/s/Rua3dUJbSyk02ide0R7rSA
软引用:当堆空间不足的时候,软引用被回收;当普通GC的时候,软引用不一定会被回收;
弱引用:只要发现,一律回收;
软引用和弱引用,十分适合做缓存,当内存不足的时候可以回收,当内存足的时候可以在内存相当时间;
虚引用:就象没引用一样,随时回收;
20) 回收器
A) 新生代用串行收集器
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代复制算法
老年代标记-压缩
B 老年代--串行收集器,使用标记压缩算法,老年代停顿时间长
C 新生代ParNew
-XX:+UseParNewGC
新生代并行
老年代串行
-XX:+UseConcMarkSweepGC:新生代用parnew,老生代用CMS
Serial收集器新生代的并行版本
复制算法
多线程,需要多核支持
-XX:ParallelGCThreads 限制线程数量
D 新生代parallelGC
类似ParNew
新生代复制算法,关注吞吐量
老年代 标记-压缩
更加关注吞吐量
-XX:+UseParallelGC
使用Parallel收集器+ 老年代串行
-XX:+UseParallelOldGC
使用Parallel收集器+ 并行老年代
-XX:MaxGCPauseMills
最大停顿时间,单位毫秒
GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio
0-100的取值范围
垃圾收集时间占总时间的比
默认99,即最大允许1%时间做GC
这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优
E 老年代用并行parallelOldGC: 新生代用 parallelGC,老年代用并行,关注吞吐量
F CMS收集器
Concurrent Mark Sweep 并发标记清除
标记-清除算法
与标记-压缩相比
并发阶段会降低吞吐量
老年代收集器(新生代使用ParNew)
-XX:+UseConcMarkSweepGC
G CMS运行过程比较复杂,着重实现了标记的过程,可分为
初始标记
根可以直接关联到的对象
速度快
并发标记(和用户线程一起)
主要标记过程,标记全部对象
重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
并发清除(和用户线程一起)
基于标记结果,直接清理对象
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次整理
整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction
设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads
设定CMS的线程数量
21) MaxTenuringThreshole,参数控制新生代对象的最大年龄,控制经过多少次GC后,进入年老代;但有的时候,即使到了,也不一定会晋升的;
22) PretenureSizeThreshold参数,控制新生代对象直接进入到老年代,前提是关闭TLAB
2)jps -m // 显示运行的程序接收的参数
3)jps -v //查看接收的JVM方面的参数
4)jps 先查出进程ID后
jstat -gcutil pid 1000 10 //每隔离1000毫秒打印,搞10次
jstaat -gcnew pid //显示新生代情况
D:\PSTools>jstat -gcnew 5328
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
62976.0 58368.0 0.0 42323.6 14 15 62976.0 199168.0 106984.4 177 5.470
显示列名
具体描述
S0C
年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
年轻代中第二个survivor(幸存区)的容量 (字节)
S0U
年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U
年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC
年轻代中Eden(伊甸园)的容量 (字节)
EU
年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC
Old代的容量 (字节)
OU
Old代目前已使用空间 (字节)
PC
Perm(持久代)的容量 (字节)
------------------------------------------------------
jstat -gcutil <pid>:统计gc信息
其中:
S0
年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1
年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E
年轻代中Eden(伊甸园)已使用的占当前容量百分比
O
old代已使用的占当前容量百分比
P
perm代已使用的占当前容量百分比
YGC
从应用程序启动到采样时年轻代中gc次数
YGCT
从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
-------------
jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
显示列名
具体描述
NGCMN
年轻代(young)中初始化(最小)的大小(字节)
NGCMX
年轻代(young)的最大容量 (字节)
NGC
年轻代(young)中当前的容量 (字节)
S0C
年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
年轻代中第二个survivor(幸存区)的容量 (字节)
EC
年轻代中Eden(伊甸园)的容量 (字节)
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量(字节)
OGC
old代当前新生成的容量 (字节)
OC
Old代的容量 (字节)
PGCMN
perm代中初始化(最小)的大小 (字节)
PGCMX
perm代的最大容量 (字节)
PGC
perm代当前新生成的容量 (字节)
PC
Perm(持久代)的容量 (字节)
YGC
从应用程序启动到采样时年轻代中gc次数
FGC
从应用程序启动到采样时old代(全gc)gc次数
---------------------------------------
jstat -gcoldcapacity <pid>: old代对象的信息及其占用量
显示列名
具体描述
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量(字节)
OGC
old代当前新生成的容量 (字节)
OC
Old代的容量 (字节)
YGC
从应用程序启动到采样时年轻代中gc次数
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
5)jinfo opiton pid
jinfo -flag pid //查看某个进程用的GC,比如
、jinfo -flg UseSericGC PID
在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable
intx CMSAbortablePrecleanWaitMillis = 100 {manageable}
intx CMSWaitDuration = 2000 {manageable}
bool HeapDumpAfterFullGC = false {manageable}
bool HeapDumpBeforeFullGC = false {manageable}
bool HeapDumpOnOutOfMemoryError = false {manageable}
... cut for brevity ...
bool PrintGC = false {manageable}
bool PrintGCDateStamps = false {manageable}
bool PrintGCDetails = false {manageable}
bool PrintGCTimeStamps = false {manageable}
通过选项-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为manageable 的flag则是值得我们关注的部分。这些flag可通过JDK management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。
如何使用jinfo
让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:
my-precious me$ jps
12278 HighAllocationRate
12279 Jps
12269 JConsole
my-precious me$ jinfo -flag +PrintGCDetails 12278
my-precious me$ jinfo -flag +PrintGC 12278
my-precious me$
在jinfo中需要打开-XX:+PrintGC和 -XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup script)来设置参数,仅需-XX:+PrintGCDetails即可,因为-XX:+PrintGC会被自动打开。
不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:
...
[GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs]
...
[GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs]
...
同理,若想关闭GC日志功能,只需要执行jinfo -flag -PrintGCDetails 12278和 jinfo -flag -PrintGC 12278命令即可。
6)jmap -dump:format=b,file=c:\aaa.bin pid
dump 出内存相关再用eclipse mat去分析;
如果结果是+号,标识有用,否则无用
7)jhat对 JMAP DUMP出来的BIN文件进行分析
jhat d:\xxxx.bin
完了后用http://localhost:7000/ 查询
8)jstack -F //强制打印
jstack -m //打印JAVA和本地方法栈
jstack -l pid //打印包含锁的信息
9) -XX:+PrintClassHistogram
按下Ctrl+Break后,打印类的信息:
num #instances #bytes class name
----------------------------------------------
1: 890617 470266000 [B
2: 890643 21375432 java.util.HashMap$Node
3: 890608 14249728 java.lang.Long
4: 13 8389712 [Ljava.util.HashMap$Node;
5: 2062 371680 [C
6: 463 41904 java.lang.Class
分别显示:序号、实例数量、总大小、类型
10) -XX:+TraceClassLoading
监控类的加载
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
11) Xmn
设置新生代大小
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
4 表示 新生代:老年代=1:4,即年轻代占堆的1/5
-XX:SurvivorRatio
设置两个Survivor区和eden的比
8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
12) -XX:+HeapDumpOnOutOfMemoryError
OOM时导出堆到文件
-XX:+HeapDumpPath
导出OOM的路径
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/a.dump
13)
打印GC的简要信息–[GC 4790K->374K(15872K), 0.0001606 secs]–
[GC 4790K->374K(15872K), 0.0001474 secs]–
[GC 4790K->374K(15872K), 0.0001563 secs]–
[GC 4790K->374K(15872K), 0.000168
这里-XX:+PrintGC,在GC前,堆空间4MB,GC后,堆为374KB,括号内表示当前可用堆为16MB
更详细的,需要-XX:+PrintGCDetails 参数;
-XX:+PrintGCTimeStamps–打印CG发生的时间戳?例–
[GC[DefNew: 4416K->0K(4928K), 0.0001897 secs] 4790K->374K(15872K), 0.0002232 secs]
[Times: user=0.00 sys=0.00, real=0.00 se
-Xloggc:log/gc.log–指定GC log的位置,以文件输出–帮助开发人员分析问题
14) 可以设置-xms=-xmx,减少程序运行的时候垃圾回收次数,提高性能;
15) 堆的分配参数?-Xmn–设置新生代大小
?-XX:NewRatio–新生代(eden+2*s)和老年代(不包含永久区)的比值–4 表示 新生代:老年代=1:4=(老年代/新生代=-xx:NewRatio);
即年轻代占堆的1/5?
-XX:SurvivorRatio–设置两个Survivor区和eden的比–8表示 两个Survivor :eden=2:8,即一个Survivor占年轻代的1/10
16)-XX:MaxDirectoryMemorySize,NIO用的直接内存,不属于堆;
17)./java -server -version
为服务模式,启动慢,但尝试更多信息去调优JVM,64位一般都为SERVER模式
18)标记清除算法,会产生碎片,适合老年代;标记复制算法,分两部分空间,把存活的对象赶到另外一半空间中,然后清除其中的有碎片的空间,适合新生代,因为垃圾多;
标记压缩算法:不需要两个空间,通过可达性分析,找到存活对象,直接压缩到另外一半空间,然后再清除剩下的,适合老年代;
19) JAVA强引用,软引用,弱引用,虚引用
参考:
https://mp.weixin.qq.com/s/Rua3dUJbSyk02ide0R7rSA
软引用:当堆空间不足的时候,软引用被回收;当普通GC的时候,软引用不一定会被回收;
弱引用:只要发现,一律回收;
软引用和弱引用,十分适合做缓存,当内存不足的时候可以回收,当内存足的时候可以在内存相当时间;
虚引用:就象没引用一样,随时回收;
20) 回收器
A) 新生代用串行收集器
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代复制算法
老年代标记-压缩
B 老年代--串行收集器,使用标记压缩算法,老年代停顿时间长
C 新生代ParNew
-XX:+UseParNewGC
新生代并行
老年代串行
-XX:+UseConcMarkSweepGC:新生代用parnew,老生代用CMS
Serial收集器新生代的并行版本
复制算法
多线程,需要多核支持
-XX:ParallelGCThreads 限制线程数量
D 新生代parallelGC
类似ParNew
新生代复制算法,关注吞吐量
老年代 标记-压缩
更加关注吞吐量
-XX:+UseParallelGC
使用Parallel收集器+ 老年代串行
-XX:+UseParallelOldGC
使用Parallel收集器+ 并行老年代
-XX:MaxGCPauseMills
最大停顿时间,单位毫秒
GC尽力保证回收时间不超过设定值
-XX:GCTimeRatio
0-100的取值范围
垃圾收集时间占总时间的比
默认99,即最大允许1%时间做GC
这两个参数是矛盾的。因为停顿时间和吞吐量不可能同时调优
E 老年代用并行parallelOldGC: 新生代用 parallelGC,老年代用并行,关注吞吐量
F CMS收集器
Concurrent Mark Sweep 并发标记清除
标记-清除算法
与标记-压缩相比
并发阶段会降低吞吐量
老年代收集器(新生代使用ParNew)
-XX:+UseConcMarkSweepGC
G CMS运行过程比较复杂,着重实现了标记的过程,可分为
初始标记
根可以直接关联到的对象
速度快
并发标记(和用户线程一起)
主要标记过程,标记全部对象
重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
并发清除(和用户线程一起)
基于标记结果,直接清理对象
-XX:+ UseCMSCompactAtFullCollection Full GC后,进行一次整理
整理过程是独占的,会引起停顿时间变长
-XX:+CMSFullGCsBeforeCompaction
设置进行几次Full GC后,进行一次碎片整理
-XX:ParallelCMSThreads
设定CMS的线程数量
21) MaxTenuringThreshole,参数控制新生代对象的最大年龄,控制经过多少次GC后,进入年老代;但有的时候,即使到了,也不一定会晋升的;
22) PretenureSizeThreshold参数,控制新生代对象直接进入到老年代,前提是关闭TLAB
发表评论
-
复习:强迫线程顺序执行方式
2019-01-03 23:42 1565方法1: 三个线程,t1,t2,t3,如果一定要按顺序执行, ... -
(转)不错的前后端处理异常的方法
2019-01-02 23:16 2016前言 在 Web 开发中, 我们经常会需要处理各种异常, 这是 ... -
info q的极客时间大咖说等资料下载
2018-08-15 08:40 3463info q的极客时间大咖说等资料下载,还有不少思维导图 链 ... -
CXF 客户端超时时间设置(非Spring配置方式)
2018-07-03 22:38 2230import org.apache.cxf.endpoint. ... -
(转)synchronized关键字画像:正确打开方式
2018-06-14 09:25 489https://mp.weixin.qq.com/s/b3Sx ... -
CountDownLatch的例子
2018-06-13 14:10 683public class StatsDemo { ... -
两道面试题,带你解析Java类加载机制
2018-06-12 16:29 606https://mp.weixin.qq.com/s/YTa0 ... -
Spring中获取request的几种方法,及其线程安全性分析
2018-06-11 09:03 667https://mp.weixin.qq.com/s/KeFJ ... -
内部类小结
2018-06-06 10:25 432https://mp.weixin.qq.com/s/hErv ... -
windows下自带命令行工具查看CPU资源情况等
2018-06-04 12:53 3095微软提供了不少命令行 ... -
(收藏)深入分析Java的序列化与反序列化
2018-05-30 15:21 611https://mp.weixin.qq.com/s/T2Bn ... -
apache common包中的序列化工具
2018-05-30 09:10 1841什么是序列化 我们的 ... -
JAVA8 JVM的变化: 元空间(Metaspace)
2018-05-24 22:30 961本文将会分享至今为至我收集的关于永久代(Permanent G ... -
(转)服务器性能指标(一)——负载(Load)分析及问题排查
2018-05-21 21:03 1359原创: Hollis Hollis 负载 ... -
(转)对象复用
2018-05-20 15:27 854public class Student { priv ... -
mapreduce中入门中要注意的几点
2018-05-06 08:59 667在 mapreduce中,比如有如下的词: I love b ... -
HDFS的基本操作
2018-05-02 21:47 936-mkdir 在HDFS创建目录 ... -
一个不错的开源工具类,专门用来解析日志头部的,好用
2018-05-02 20:00 767一个不错的开源工具类,专门用来解析日志头部的,好用。 http ... -
介绍个不错的RESTFUL MOCK的工具wiremock
2018-04-27 21:02 1903介绍个不错的RESTFUL MOCK的工具wiremock,地 ... -
LINUX下EPOLL等不错的文章收藏
2018-04-25 09:35 5551 通俗讲解 异步,非阻塞和 IO 复用 https:/ ...
相关推荐
视频目录 第1节说在前面的话 [免费观看] 00:05:07分钟 | 第2节整个部分要讲的内容说明 [免费观看] 00:06:58分钟 | 第3节环境搭建以及jdk,...第104节字节码执行引擎小结00:03:38分钟 | 第105节总结与回顾00:10:55分钟
1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行...
第104讲 字节码执行引擎小结 00:03:38 第105讲 总结与回顾 00:10:55 第106讲 happens-before简单概述 00:15:17 第107讲 重排序问题 00:23:19 第108讲 锁的内存语义 00:13:54 第109讲 volatile的...
##### 小结 本节介绍的JVM参数如下: | 参数 | 说明 | |----------------|----------------------------------------------------------| | `-version` | 打印JVM版本信息 | | `-showversion` | 打印版本信息并...
### Java语言基础小结 #### 一、JDK, JRE, JVM的关系 - **JVM(Java Virtual Machine)**:Java虚拟机是Java程序跨平台运行的核心,它负责执行Java字节码(.class文件),确保Java程序可以在不同的平台上运行而...
通过RMI,一个Java对象可以调用在不同JVM(Java虚拟机)上的另一个对象的方法,实现跨网络的透明操作。这篇博客“RMI入门小结”主要探讨了RMI的基础概念、实现步骤以及常见问题。 1. RMI的基本原理: RMI的核心是...
与传统的Java虚拟机(JVM)不同,Dalvik虚拟机执行的是.dex文件格式的字节码,这种格式经过了专门的设计,以便更有效地运行在移动设备上。 - **Dalvik的优势**: - 在编译阶段就进行了代码优化,而不是在运行时动态...
本文主要涵盖了Java处理中文字符编码的关键点,包括Java虚拟机(JVM)的初始配置、编译过程中的编码设置、文件读写操作、XML文件处理以及字符串与字节数组之间的转换。 首先,JVM在启动时会根据操作系统环境设定...
Java中的守护线程(Daemon Threads)是用于支持应用程序运行的重要组件,它们在后台执行任务,不会阻止Java虚拟机(JVM)的退出。守护线程的主要任务是为其他非守护线程提供服务,例如垃圾回收线程就是典型的守护...
### Hive工作调优小结 #### 一、Map阶段的优化(Map Phase) 在Hive中,Map任务的数量直接影响到整个Hive作业的性能。Map任务的数量由以下公式计算得出: \[ \text{num_Map_tasks} = \max[\text{Mapred.min.split...
这意味着Java程序在任何支持Java的平台上都可以运行,这得益于Java的跨平台特性——Java虚拟机(JVM)。 1. **基本语法**:Java的语句以分号结束,它有严格的缩进规则,使得代码更易读。变量声明需要指定数据类型,...
这个类允许你指定命令行参数,包括可执行文件(Java虚拟机)和启动参数。例如,`ProcessBuilder.start()`方法会启动一个新的进程。如果需要在不同JVM之间通信,可以使用RMI(远程方法调用)、Socket编程或者通过共享...
RMI(Remote Method Invocation,远程方法调用)是Java平台中用于分布式计算的一种技术,它允许一个Java对象调用另一个在不同 JVM(Java虚拟机)上的对象的方法,从而实现跨网络的通信。Java RMI 提供了一种透明的...
### JavaSE与JavaEE基础部分小结 #### JavaSE 基础知识点 ##### Java语言特点 1. **跨平台性**:Java的核心优势之一在于它的可移植性,即“一次编写,处处运行”。这意味着Java程序可以在任何安装了Java运行环境...
- `boolean`:通常认为是1字节,但实际上Java虚拟机(JVM)并未明确规定其大小,但在实践中通常按1字节处理。 #### 二、Cavaj软件:Java反编译工具 Cavaj是一款强大的Java反编译工具,它能够将Java字节码(.class文件...
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...