diff -r aaf61e68b255 src/share/vm/runtime/arguments.cpp
--- a/src/share/vm/runtime/arguments.cpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/runtime/arguments.cpp	Tue Aug 07 17:14:49 2012 +0900
@@ -1706,18 +1706,16 @@
 // NumberOfGCLogFiles is 0, or GCLogFileSize is 0
 void check_gclog_consistency() {
   if (UseGCLogFileRotation) {
-    if ((Arguments::gc_log_filename() == NULL) ||
-        (NumberOfGCLogFiles == 0)  ||
-        (GCLogFileSize == 0)) {
+    if ((Arguments::gc_log_filename() == NULL) || (NumberOfGCLogFiles == 0)){
       jio_fprintf(defaultStream::output_stream(),
                   "To enable GC log rotation, use -Xloggc:<filename> -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=<num_of_files> -XX:GCLogFileSize=<num_of_size>\n"
-                  "where num_of_file > 0 and num_of_size > 0\n"
+                  "where num_of_file > 0\n"
                   "GC log rotation is turned off\n");
       UseGCLogFileRotation = false;
     }
   }
 
-  if (UseGCLogFileRotation && GCLogFileSize < 8*K) {
+  if (UseGCLogFileRotation && !FLAG_IS_DEFAULT(GCLogFileSize) && (GCLogFileSize < 8*K)) {
         FLAG_SET_CMDLINE(uintx, GCLogFileSize, 8*K);
         jio_fprintf(defaultStream::output_stream(),
                     "GCLogFileSize changed to minimum 8K\n");
diff -r aaf61e68b255 src/share/vm/runtime/safepoint.cpp
--- a/src/share/vm/runtime/safepoint.cpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/runtime/safepoint.cpp	Tue Aug 07 17:14:49 2012 +0900
@@ -545,7 +545,7 @@
 
   // rotate log files?
   if (UseGCLogFileRotation) {
-    gclog_or_tty->rotate_log();
+    gclog_or_tty->rotate_log(false);
   }
 
   if (MemTracker::is_on()) {
diff -r aaf61e68b255 src/share/vm/runtime/vm_operations.hpp
--- a/src/share/vm/runtime/vm_operations.hpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/runtime/vm_operations.hpp	Tue Aug 07 17:14:49 2012 +0900
@@ -95,6 +95,7 @@
   template(ReportJavaOutOfMemory)                 \
   template(JFRCheckpoint)                         \
   template(Exit)                                  \
+  template(RotateGCLog)                           \
 
 class VM_Operation: public CHeapObj<mtInternal> {
  public:
@@ -406,4 +407,17 @@
   void doit();
 };
 
+
+class VM_RotateGCLog: public VM_Operation{
+
+  private:
+    bool _isForce;
+
+  public:
+    VM_RotateGCLog(bool isForce) { _isForce = isForce; }
+    VMOp_Type type() const { return VMOp_RotateGCLog; }
+    void doit() { gclog_or_tty->rotate_log(_isForce); }
+
+};
+
 #endif // SHARE_VM_RUNTIME_VM_OPERATIONS_HPP
diff -r aaf61e68b255 src/share/vm/services/diagnosticCommand.cpp
--- a/src/share/vm/services/diagnosticCommand.cpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/services/diagnosticCommand.cpp	Tue Aug 07 17:14:49 2012 +0900
@@ -47,6 +47,7 @@
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<HeapDumpDCmd>(true, false));
 #endif // SERVICES_KERNEL
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ClassHistogramDCmd>(true, false));
+  DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<RotateGCLogDCmd>(true, false));
   DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<ThreadDumpDCmd>(true, false));
 
   //Enhanced JMX Agent Support
@@ -531,3 +532,32 @@
     JavaCalls::call_static(&result, ik, vmSymbols::stopRemoteAgent_name(), vmSymbols::void_method_signature(), CHECK);
 }
 
+RotateGCLogDCmd::RotateGCLogDCmd(outputStream* output, bool heap) :
+                                              DCmdWithParser(output, heap),
+  _force("-force", "Force execute GC log rotation.", "BOOLEAN", false, "false") {
+  _dcmdparser.add_dcmd_option(&_force);
+}
+
+void RotateGCLogDCmd::execute(TRAPS) {
+
+  if(UseGCLogFileRotation){
+    VM_RotateGCLog rotateop(_force.value());
+    VMThread::execute(&rotateop);
+  }
+  else{
+    output()->print_cr("Target VM is not supported GC log rotation.");
+  }
+
+}
+
+int RotateGCLogDCmd::num_arguments() {
+    ResourceMark rm;
+    RotateGCLogDCmd* dcmd = new RotateGCLogDCmd(NULL, false);
+    if (dcmd != NULL) {
+      DCmdMark mark(dcmd);
+      return dcmd->_dcmdparser.num_arguments();
+    } else {
+      return 0;
+    }
+}
+
diff -r aaf61e68b255 src/share/vm/services/diagnosticCommand.hpp
--- a/src/share/vm/services/diagnosticCommand.hpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/services/diagnosticCommand.hpp	Tue Aug 07 17:14:49 2012 +0900
@@ -292,4 +292,18 @@
   virtual void execute(TRAPS);
 };
 
+class RotateGCLogDCmd : public DCmdWithParser {
+protected:
+  DCmdArgument<bool> _force;
+public:
+  RotateGCLogDCmd(outputStream* output, bool heap);
+  static const char* name() { return "GC.rotate_log"; }
+  static const char* description() {
+    return "GC log rotation.";
+  }
+  static const char* impact() { return "Low"; }
+  static int num_arguments();
+  virtual void execute(TRAPS);
+};
+
 #endif // SHARE_VM_SERVICES_DIAGNOSTICCOMMAND_HPP
diff -r aaf61e68b255 src/share/vm/utilities/ostream.cpp
--- a/src/share/vm/utilities/ostream.cpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/utilities/ostream.cpp	Tue Aug 07 17:14:49 2012 +0900
@@ -424,8 +424,21 @@
 // write to gc log file at safepoint. If in future, changes made for mutator threads or
 // concurrent GC threads to run parallel with VMThread at safepoint, write and rotate_log
 // must be synchronized.
-void rotatingFileStream::rotate_log() {
-  if (_bytes_writen < (jlong)GCLogFileSize) return;
+void rotatingFileStream::rotate_log(bool isForce) {
+
+  if(!isForce){ /* rotation request is NOT force. */
+
+    if(GCLogFileSize == 0){
+      /* GC log rotation occurs external force trigger ONLY. */
+      return;
+    }
+    else if(_bytes_writen < (jlong)GCLogFileSize){
+      /* This case is size-based rotation and not need to rotate log yet. */
+      return;
+    }
+
+  }
+
 #ifdef ASSERT
   Thread *thread = Thread::current();
   assert(thread == NULL ||
diff -r aaf61e68b255 src/share/vm/utilities/ostream.hpp
--- a/src/share/vm/utilities/ostream.hpp	Mon Aug 06 12:20:14 2012 -0700
+++ b/src/share/vm/utilities/ostream.hpp	Tue Aug 07 17:14:49 2012 +0900
@@ -110,7 +110,7 @@
    // flushing
    virtual void flush() {}
    virtual void write(const char* str, size_t len) = 0;
-   virtual void rotate_log() {} // GC log rotation
+   virtual void rotate_log(bool isForce) {} // GC log rotation
    virtual ~outputStream() {}   // close properly on deletion
 
    void dec_cr() { dec(); cr(); }
@@ -223,7 +223,7 @@
   rotatingFileStream(FILE* file) : fileStream(file) {}
   ~rotatingFileStream();
   virtual void write(const char* c, size_t len);
-  virtual void rotate_log();
+  virtual void rotate_log(bool isForce);
 };
 
 void ostream_init();
