'Study'에 해당되는 글 22건

  1. 2014.10.10 Concurrent GC
  2. 2014.10.08 -XX:SurvivorRatio=<value>
  3. 2014.09.14 초보에서 고급까지, 웹으로 프로그래밍 배우자.
  4. 2014.09.09 MOOC 강의
  5. 2014.08.14 GC Options2
  6. 2014.08.14 GC Option
  7. 2014.08.11 -XX:CMSInitiatingOccupancyFraction
  8. 2014.08.07 Oracle Opensource site
  9. 2014.08.01 DisableExplicitGC, ParallelGCThreads,
  10. 2014.07.30 wc -l
2014. 10. 10. 13:51

1. 정의

   CMS Collector는 Tenured Generation 에 대한 GC 작업을 Application Thread의 Pause를 최소화하면서 Concurrent 하게 진행

   CMS Collector 에 의한 GC 작업을 Concurrent GC라고 부름.

   SWT 방식의 Full GC가 가지는 단점을 최소화하고 응답 시간을 최적화하기 위해 고안된 GC 방법

 

2. 단계

  Concurrent GC 단계

  1) Initial Mark Phase

 

  2) Concurrent Mark Phase

 

  3) Concurrent Preclean Phase

 

  4) Rescan Phase

 

  5) Concurrent Sweep Phase

 

  6) Concurrent Reset Phase

'Study' 카테고리의 다른 글

-XX:SurvivorRatio=<value>  (0) 2014.10.08
초보에서 고급까지, 웹으로 프로그래밍 배우자.  (0) 2014.09.14
MOOC 강의  (0) 2014.09.09
GC Options2  (0) 2014.08.14
GC Option  (0) 2014.08.14
Posted by 아도니우스
2014. 10. 8. 18:04

Survivor Space 와 Eden Space 의 비율을 지정한다.

만일 이 값이 6이면, To Survivor Ratio : From Survivor Ratio : Eden Space = 1:1:6 이 된다.

즉, 하나의 Survivor Space 의 크기가 Young Generation 의 1/8이 된다.

Survivor Space의 크기가 크면 Tenured Generation 으로 옮겨가지 전의 중간 버퍼 영역이 커지는 셈.

따라서, Full GC 의 빈도를 줄이는 역할을 할 수 있다. 반면 Eden Space의 크기가 줄어들므로 Minor GC가 자주 발생하게 됨

'Study' 카테고리의 다른 글

Concurrent GC  (0) 2014.10.10
초보에서 고급까지, 웹으로 프로그래밍 배우자.  (0) 2014.09.14
MOOC 강의  (0) 2014.09.09
GC Options2  (0) 2014.08.14
GC Option  (0) 2014.08.14
Posted by 아도니우스
2014. 9. 14. 12:12

1. 코드카데미 주소 : http://www.codecademy.com/

2. what is SOA : http://www.middlewareschools.com/

 

※ 참고사이트 : http://www.bloter.net/archives/176582, http://www.bloter.net/archives/197960

'Study' 카테고리의 다른 글

Concurrent GC  (0) 2014.10.10
-XX:SurvivorRatio=<value>  (0) 2014.10.08
MOOC 강의  (0) 2014.09.09
GC Options2  (0) 2014.08.14
GC Option  (0) 2014.08.14
Posted by 아도니우스
2014. 9. 9. 20:12

Coursera : 625 강좌, 참여대학 236개, 참여대학 평균랭킹 154위

https://www.coursera.org

edX : 215강좌, 참여대학 52개, 참여대학 평균랭킹 78위

https://www.edx.org

FutureLearn : 88강좌, 참여대학 36개, 참여대학 랭킹 121위

https://www.futurelearn.com

 

'Study' 카테고리의 다른 글

-XX:SurvivorRatio=<value>  (0) 2014.10.08
초보에서 고급까지, 웹으로 프로그래밍 배우자.  (0) 2014.09.14
GC Options2  (0) 2014.08.14
GC Option  (0) 2014.08.14
-XX:CMSInitiatingOccupancyFraction  (0) 2014.08.11
Posted by 아도니우스
2014. 8. 14. 20:08

In this part of our series we focus on one of the major areas of the heap, the “young generation”. First of all, we discuss why an adequate configuration of the young generation is so important for the performance of our applications. Then we move on to learn about the relevant JVM flags.

From a purely functional perspective, a JVM does not need a young generation at all – it can do with a single heap area. The sole reason for having a young generation in the first place is to optimize the performance of garbage collection (GC). More specifically, the separation of the heap into a young generation and an old generation has two benefits: It simplifies the allocation of new objects (because allocation only affects the young generation) and it allows for a more efficient cleanup of objects not needed anymore (by using different GC algorithms in the two generations).

Extensive measurements across a wide range of object-oriented programs have shown that many applications share a common characteristic: Most objects “die” young, i.e., after their creation they are not referenced for long in the program flow. Also, it has been observed that young objects are rarely referenced by older objects. Now if we combine these two obsrvations, it becomes apparent that it is desirable for GC to have quick access to young objects – for example in a separate heap area called the “young generation”. Within this heap area, GC can then identify and collect “dead” young objects quickly without having to search them between all the old objects that will still live on the heap for a long time.

The Sun/Oracle HotSpot JVM further divides the young generation into three sub-areas: one large area named “Eden” and two smaller “survivor spaces” named “From” and “To”. As a rule, new objects are allocated in “Eden” (with the exception that if a new object is too large to fit into “Eden” space, it will be directly allocated in the old generation). During a GC, the live objects in “Eden” first move into the survivor spaces and stay there until they have reached a certain age (in terms of numbers of GCs passed since their creation), and only then they are transferred to the old generation. Thus, the role of the survivor spaces is to keep young objects in the young generation for a little longer than just their first GC, in order to be able to still collect them quickly should they die soon afterwards.

Based on the assumption that most of the young objects may be deleted during a GC, a copying strategy (“copy collection”) is being used for young generation GC. At the beginning of a GC, the survivor space “To” is empty and objects can only exist in “Eden” or “From”. Then, during the GC, all objects in “Eden” that are still being referenced are moved into “To”. Regarding “From”, the still referenced objects in this space are handled depending on their age. If they have not reached a certain age (“„tenuring threshold“”), they are also moved into “To”. Otherwise they are moved into the old generation. At the end of this copying procedure, “Eden” and “From” can be considered empty (because they only contain dead objects), and all live objects in the young generation are located in “To”. Should “To” fill up at some point during the GC, all remaining objects are moved into the old generation instead (and will never return). As a final step, “From” and “To” swap their roles (or, more precisely, their names) so that “To” is empty again for the next GC and “From” contains all remaining young objects.

Example: The young generation right before and after a garbage collection

Example showing the initial state and the result of a young generation GC. Free space is green, objects not referenced anymore are yellow, and still referenced objects are red. In this example, the survivor spaces are large enough so that no objects need to be moved into the old generation.

As a summary, an object is usually born in “Eden” and then alternates between the survivor spaces on each young generation GC. If the objects survives until a certain number of young generation GCs has passed, it will finally be moved into the old generation and stay there with all other long-lived objects. When the object eventually dies in the old generation, it has to be collected with higher effort, by one of the more heavyweight GC algorithms (a plain copy collection cannot be used here – there simply is no place to copy to).

It now becomes clear why young generation sizing is so important: If the young generation is too small, short-lived objects will quickly be moved into the old generation where they are harder to collect. Conversely, if the young generation is too large, we will have lots of unnecessary copying for long-lived objects that will later be moved to the old generation anyway. Thus we need to find a compromise somewhere between small and large young generation size. Unfortunately, finding the right compromise for a particular application can often only be done by systematic measurement and tuning. And that’s where the JVM flags come into play.

-XX:NewSize and -XX:MaxNewSize

Similar to the total heap size (with -Xms and -Xmx) it is possible to explicitly set a lower and upper bound for the size of the young generation. However, when setting -XX:MaxNewSize we need to take into account that the young generation is only one part of the heap and that the larger we choose its size the smaller the old generation will be. For stability reasons it is not allowed to choose a young generation size larger than the old generation, because in the worst case it may become necessary for a GC to move all objects from the young generation into the old generation. Thus -Xmx/2 is an upper bound for -XX:MaxNewSize.

For performance reasons we may also specify the initial size of the young generation using the flag -XX:NewSize. This is useful if we know the rate at which young objects are being allocated (for example because we measured it!) and can save some of the costs required for slowly growing the young generation to that size over time.

-XX:NewRatio

It is also possible to specify the young generation size in relation to the size of the old generation. The potential advantage of this approach is that the young generation will grow and shrink automatically when the JVM dynamically adjusts the total heap size at run time. The flag -XX:NewRatio allows us to specify the factor by which the old generation should be larger than the young generation. For example, with -XX:NewRatio=3 the old generation will be three times as large as the young generation. That is, the old generation will occupy 3/4 and the young generation will occupy 1/4 of the heap.

If we mix absolute and relative sizing of the young generation, the absolute values always have precedence. Consider the following example:

$ java -XX:NewSize=32m -XX:MaxNewSize=512m -XX:NewRatio=3 MyApp

With these settings, the JVM will try to size the young generation at one third of the old generation size, but it will never let young generation size fall below 32 MB or exceed 512 MB.

There is no general rule if absolute or relative young generation sizing is preferable. If we know the memory usage of our application well, it can be advantageous to specify a fixed size both for the total heap and the young generation, and it can also be useful to specify a ratio. If we only know a little or maybe nothing at all about our application in this respect, the correct approach is to just let the JVM do the work and not to mess around with the flags. If the application runs smoothly, we can be happy that we didn’t put in extra effort where none was needed. And should we encounter performance problems or OutOfMemoryErrors, we would still need to first perform a series of meaningful measurements to narrow down the root cause of the problem before moving on to tuning.

-XX:SurvivorRatio

The flag -XX:SurvivorRatio is similar to -XX:NewRatio but applies to the areas inside the young generation. The value of -XX:SurvivorRatio specifies how large “Eden” should be sized relative to one of the two survivor spaces. For example, with -XX:SurvivorRatio=10 we dimension “Eden” ten times as large as “To” (and at the same time ten times as large as “From”). As a result, “Eden” occupies 10/12 of the young generation while “To” and “From” each occupy 1/12. Note that the two survivor spaces are always equal in size.

What effect does survivor space sizing have? Suppose that the survivor spaces are very small compared to “Eden”. Then we have lots of space in “Eden” for newly allocated objects, which is desirable. If all these objects can be collected during the next GC, “Eden” is empty again and everything is fine. However, if some of these young objects are still being referenced, we have only little space in the survivor spaces to accommodate them. As a consequence, most of these objects will be moved to the old generation right after their first GC, which is not desirable. Now let us consider the opposite situation: Suppose that the survivor spaces are relatively large in size. Then they have lots of space to fulfill their main purpose, to accommodate objects that survive one or more GCs but still die young. However, the smaller “Eden” space will be exhausted more quickly, which increases the number of young generation GCs performed. This is undesirable.

In summary, we want to minimize the number of short-lived objects that are prematurely moved into the old generation, but we also want to minimize the number and duration of young generation GCs. Once again we need to find a compromise, which in turn depends on the characteristics of the application at hand. A good starting point for finding an adequate compromise is to learn about the age distribution of the objects in the particular application.

-XX:+PrintTenuringDistribution

With the flag -XX:+PrintTenuringDistribution we tell the JVM to print the age distribution of all objects contained in the survivor spaces on each young generation GC. Take the following example:

Desired survivor size 75497472 bytes, new threshold 15 (max 15)
- age   1:   19321624 bytes,   19321624 total
- age   2:      79376 bytes,   19401000 total
- age   3:    2904256 bytes,   22305256 total

The first line tells us that the target utilization of the “To” survivor space is about 75 MB. It also shows some information about the “tenuring threshold”, which represents the number of GCs that an object may stay in the young generation before it is moved into the old generation (i.e., the maximum age of the object before it gets promoted). In this example, we see that the current tenuring threshold is 15 and that its maximum value is 15 as well.

The next lines show, for each object age lower than the tenuring threshold, the total number of bytes of all objects that currently have that age (if no objects currently exist for a certain age, that line is omitted). In the example, about 19 MB have already survived one GC, about 79 KB have survived two GCs, and about 3 MB have survived three GCs. At the end of each line, we see the accumulated byte count of all objects up to that age. Thus, the “total” value in the last line indicates that the “To” survivor space currently contains about 22 MB of object data. As the target utilization of “To” is 75 MB and the current tenuring threshold is 15, we can conclude that no objects have to be promoted to the old generation as part of the current young generation GC. Now suppose that the next GC leads to the following output:

Desired survivor size 75497472 bytes, new threshold 2 (max 15)
- age   1:   68407384 bytes,   68407384 total
- age   2:   12494576 bytes,   80901960 total
- age   3:      79376 bytes,   80981336 total
- age   4:    2904256 bytes,   83885592 total

Let us compare the output to the previous tenuring distribution. Apparently, all the objects of age 2 and 3 from the previous output are still located in “To”, because here we see exactly the same number of bytes printed for age 3 and 4. We can also conclude that some of the objects in “To” have been successfully collected by the GC, because now we only have 12 MB of objects of age 2 while in the previous output we had 19 MB listed for age 1. Finally, we see that about 68 MB of new objects, shown at age 1, have been moved from “Eden” into “To” during the last GC.

Note that the total number of bytes in “To” – in this case almost 84 MB – is now larger than the desired number of 75 MB. As a consequence, the JVM has reduced the tenuring threshold from 15 to 2, so that with the next GC some of the objects will be forced to leave “To”. These objects will then either be collected (if they have died in the meantime) or moved to the old generation (if they are still referenced).

-XX:InitialTenuringThreshold, -XX:MaxTenuringThreshold and -XX:TargetSurvivorRatio

The tuning knobs shown in the output of -XX:+PrintTenuringDistribution can be adjusted by various flags. With -XX:InitialTenuringThreshold and -XX:MaxTenuringThreshold we can set the initial and maximum value of the tenuring threshold, respectively. Additionally, we can use -XX:TargetSurvivorRatio to specify the target utilization (in percent) of “To” at the end of a young generation GC. For example, the combination -XX:MaxTenuringThreshold=10 -XX:TargetSurvivorRatio=90 sets an upper bound of 10 for the tenuring threshold and a target utilization of 90 percent for the “To” survivor space.

While there are different approaches to use these flags to tune young generation behavior, no general guideline is available. We restrict ourselves to two cases that are pretty clear:

  • If the tenuring distribution shows that many objects just grow older and older before finally reaching the maximum tenuring threshold, this indicates that the value of -XX:MaxTenuringThreshold may be too large.
  • If the value of -XX:MaxTenuringThreshold is larger than 1 but most objects never reach an age larger than 1, we should take a look at the target utilization of “To”. Should the target utilization never be reached, then we know that all young objects get collected by the GC, which is exactly what we want. However, if the target utilization is frequently reached, then at least some of the objects beyond age 1 have been moved into the old generation, and maybe prematurely so. In this case, we can try to tune the survivor spaces by increasing their size or target utilization.

-XX:+NeverTenure and -XX:+AlwaysTenure
Finally, I would like to quickly mention two rather exotic flags which we can use to test two extremes of young generation GC behavior. If -XX:+NeverTenure is set, objects are never promoted to the old generation. This behavior makes sense when we are sure that we don’t need an old generation at all. However, as such, the flag is apparently very risky and also wastes at least half of the reserved heap memory. The inverse behavior can be triggered with -XX:+AlwaysTenure, i.e., no survivor spaces are used so that all young objects are immediately promoted to the old generation on their first GC. Again, it is difficult to find a valid use case for this flag – it can be fun to see what happens in a testing environment, but apart from that I would not recommend using either flag.

Conclusion

It is important to run an application with an adequate configuration for the young generation, and there are quite a few flags to tune it. However, tuning the young generation without considering the old generation as well rarely leads to success. When tuning the heap or the GC settings, we should always take the interplay between the young and old generation into account.

In the next two parts of this series we will learn about two fundamental old generation GC strategies offered by the HotSpot JVM. We will get to know the “Throughput Collector” and the “Concurrent Low Pause Collector” and take a look at their basic principles, algorithms, and tuning flags.

'Study' 카테고리의 다른 글

초보에서 고급까지, 웹으로 프로그래밍 배우자.  (0) 2014.09.14
MOOC 강의  (0) 2014.09.09
GC Option  (0) 2014.08.14
-XX:CMSInitiatingOccupancyFraction  (0) 2014.08.11
Oracle Opensource site  (0) 2014.08.07
Posted by 아도니우스
2014. 8. 14. 19:53

Tuning Heap And Garbage Collector

This page outlines some methods used to improve the performance of ingests using Fedora Commons by tuning the heap and the garbage collector. A full coverage of the topic in general is not possible due to the excessive amount of information available. Introductory documentation is available here and here. Please note that this article pertains solely to the mass-ingest in Fedora Commons. Other use cases may need different tuning strategies.

Introduction

For server based applications it is very important that the heap is adequately sized. A heap too small will result in frequent garbage collections, or even OutOfMemoryErrors as a worst case scenario. A heap too big will prolong garbage collection times and, set to extremes, eventually force the operating system to start page-swapping which is likely to have a significant negative impact on performance.

The Java VM does set the heap size automatically, this feature is referred to as "Ergonomics". If the VM determines that the machine is a "server class" computer, the heap is sized as follows:

  • initial heap size of 1/64 of physical memory up to 1Gbyte
  • maximum heap size of 1/4 of physical memory up to 1Gbyte

For a machine with 2G RAM this translates into an initial heap size of 32M and a maximum heap size of 512M.

Detecting a small heap

For many applications the default heap size is too small. There are several factors which suggest, when present, an increase of heap size. For example:

  • OutOfMemoryErrors
  • Frequent garbage collections
  • Generally slow application performance which cannot exclusively be attributed to other factors like IO or CPU.

The screenshot below is a snapshot of the heap during an ingest taken with Visual GC. The image shows an untuned heap. There are many garbage collections being run explicitly by Fedora Commons. The class responsible for the frequent collections is fedora.server.storage.DefaultDOManager. Before each commit it checks if there is at least 30% of the heap space available. If not, it triggers a full garbage collection. This situation is undesirable because full garbage collections are very expensive operations consuming a lot of execution time (also being referred to as "stop-the-world") and as a result the heap runs inefficiently.

 

Therefore, as a first step it is necessary to disable explicit garbage collections. This can be done by setting the following Java VM option:

-XX:+DisableExplicitGC

The following image shows the result of disabling explicit garbage collections:

Some aspects have improved, namely:

 

  • The survivor spaces are being used
  • Tenured space is not permanently full
  • There are much less full garbage collections

There are still problems left. For one, there are still major garbage collections and old gen space fills up rather quickly. Furthermore eden space does still trigger frequent garbage collections.
This can be significantly improved by simply increasing the heap size.

The next image below shows the situation of the heap after an increase in space and some minor tuning. The eden space is now bigger and consequently gets filled up much slower until a minor gc is run, forming a triangular pattern. The tenured space (old gen) now rarely triggers a full garbage collection due to the low amount of objects being copied from the survivor spaces. Also, there is no more premature promotion to old gen space.

 

Finding the optimal heap size

In order to size the heap appropriately, it must be clear what the desired outcome should be. The typical heap profile for the ingest consists of many new objects, some survivors and very few old objects (somewhat more extreme than here). Therefore the goals for the ingest are:
  • maximum throughput of gc and minimum gc time
  • finding a balance between survivor ratio and tenuring threshold, meaning survivors should be kept in survivor space long enough so they likely die before reaching tenured space and at the same time aging objects shouldn't be kept in the survivor spaces too long
  • prevent premature promotion

GC times were measured by adding the following options to the VM:

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -verbose:gc -Xloggc:gc.log
There are several tools available to analyze gc logfiles. One of them is available here.

Results

The test setup was as follows:
  • 48,000 digital objects, external managed content
  • Java 1.6.0_04, 64 bit
  • Apache Tomcat 5.5
  • Postgres 8.3 local (also MPT)

Several test runs were conducted using different heap sizes. Eventually a size somewhere between 756m and 1G was found to produce the best results. Bigger sizes than 1,2G slightly decreased performance. Less than 756m resulted in a markedly decreased performance.

-Xms1g -Xmx1g 
-XX:+DisableExplicitGC
-XX:SurvivorRatio=10
-XX:TargetSurvivorRatio=90
-XX:MaxTenuringThreshold=30

Setting the initial heap size and maximum heap size equal had a measurable impact on ingest performance as this prevents the VM to resize the heap and forces the server to use all the allocated memory from startup. Not setting initial and maximum heap size equal resulted in a noticable performance degradation after some time due to a eden size set too small. It appears that the autoadjust feature sometimes sets the eden size too small.

The following four additional parameters are not absolutely necessary. They improve performance slightly in short test runs (50,000) but their long-term impact is not yet clear.

  • -XX:+DisableExplicitGC is the safety precausion discussed previously.
  • -XX:SurvivorRatio=10 increases the survivor spaces in order to keep survivors longer alive.
  • -XX:TargetSurvivorRatio=90 increases the maximum percentage of available survivor space.
  • -XX:MaxTenuringThreshold=30 keeps objects from being copied to tenured space too early.

The following image shows a comparison between an untuned heap and a tuned heap using the test setup described above. The improvement in ingest time is about 9%, however this should be seen as qualitative result only due to the high variance associated with this particular test case. Several test runs were conducted and improvements of about 5% to 10% (for some even more) were seen.

 

Notes:

  • It is also important to adjust the heap size of the ingesting client accordingly.
  • The Java VM takes some "warm up time" until the measurements can be considered reliable. This is mainly due to the JIT compiler profiling, inlining, optimizing, compiling etc. (for visual see images).
  • When tuning heap and gc some variance of the outcome is to be expected and therefore seen more qualitative rather than quantitative.
  • Other factors seem secondary for this use case like using some of the the vast array of available configuration switches for the Java VM. They did not improve results and were actually likely to worsen the situation in many cases.
  • For the ingest the throughput garbage collector was used. As it is the default choice for a server class machine, no additional tuning was required. Additional tuning of the throughput collector, even changing the garbage collector, did not improve ingest times.
  • Tuning the heap (beyond adjusting it's size) and gc is highly dependent on the individual hardware/software combination as well as the underlying use case and may therefore in many cases be a futile excercise or even hurt performance due to the highly self-tuning Java VM (especially since Java 6).

'Study' 카테고리의 다른 글

MOOC 강의  (0) 2014.09.09
GC Options2  (0) 2014.08.14
-XX:CMSInitiatingOccupancyFraction  (0) 2014.08.11
Oracle Opensource site  (0) 2014.08.07
DisableExplicitGC, ParallelGCThreads,  (0) 2014.08.01
Posted by 아도니우스
2014. 8. 11. 21:45

CMS에서 HeapSize 차지하는 비율

-XX:CMSInitiatingOccupanyFracction=60, -XX:CMSInitiatingOccupanyFraction=90

if) CMSInitiatingOccupanyFraction 옵션이 지정되어 있지 않으면, Old Generation 영역이 92%정도 사용될 때, Concurrent Full GC가 사용된다

이 옵션을 지정하면 50%에서 시작하며, 옵션으로 지정된 값까지 점진적으로 임계값을 조정한다.

이 옵션의 값이 작으면, CMS Collection 이 그만큼 빨리 동작하기 때문에 Promotion Failure에 의한 STW GC 작업이 발생할 확률이 그만큼 줄어든다.

참고사이트 : http://blog.ragozin.info/2011/10/java-cg-hotspots-cms-and-heap.html

'Study' 카테고리의 다른 글

GC Options2  (0) 2014.08.14
GC Option  (0) 2014.08.14
Oracle Opensource site  (0) 2014.08.07
DisableExplicitGC, ParallelGCThreads,  (0) 2014.08.01
wc -l  (0) 2014.07.30
Posted by 아도니우스
2014. 8. 7. 19:24

1. oss.oracle.com

2. java.net (home.java.net)

'Study' 카테고리의 다른 글

GC Option  (0) 2014.08.14
-XX:CMSInitiatingOccupancyFraction  (0) 2014.08.11
DisableExplicitGC, ParallelGCThreads,  (0) 2014.08.01
wc -l  (0) 2014.07.30
Apache Configuration  (0) 2014.07.28
Posted by 아도니우스
2014. 8. 1. 20:12
-XX:+DisableExplicitGC 옵션은 System.gc() 메소드를 호출해도 아무 일이 일어나지 않도록 한다.

이 때문에 분산 gc가 제대로 수행되지 않아서 ClassLoader가 gc되지 못하였고, 결국 perm area가 full이 났던 것이다.

-XX:+ParallelGCThreads

If you turn on ParallelGC for your application and do not set –XX:ParallelGCThreads, then the JVM will set number of parallel GC threads based on number of processors (cores) available on a machine where your application is running.

The JVM will create one parallel GC thread per processor (core) for young generation.

-XX:+ParallelRefProcEnabled

Enable parallel reference processing whenever possible

'Study' 카테고리의 다른 글

-XX:CMSInitiatingOccupancyFraction  (0) 2014.08.11
Oracle Opensource site  (0) 2014.08.07
wc -l  (0) 2014.07.30
Apache Configuration  (0) 2014.07.28
lsof  (0) 2014.07.23
Posted by 아도니우스
2014. 7. 30. 17:01

grep 2013:11:01 acess_20140730.log | wc -l

netstat -na | grep EST | grep 8443(PORT) | wc -l

'Study' 카테고리의 다른 글

Oracle Opensource site  (0) 2014.08.07
DisableExplicitGC, ParallelGCThreads,  (0) 2014.08.01
Apache Configuration  (0) 2014.07.28
lsof  (0) 2014.07.23
Tool  (0) 2014.07.23
Posted by 아도니우스