1. An apparatus comprising: at least one processor; a memory coupled to the at least one processor; a streaming application residing in the memory and executed by the at least one processor, the streaming application comprising a flow graph that includes a plurality of operators that process a plurality of data tuples; a plurality of performance thresholds residing in the memory for the plurality of operators in the flow graph; and a streams manager residing in the memory and executed by the at least one processor, the streams manager deploying the flow graph on at least one virtual machine (VM), monitoring performance of the streaming application, and when performance of a first portion of the streaming application in a selected VM does not satisfy at least one of the plurality of performance thresholds, the streams manager determines when the first portion of the streaming application in the selected VM is overperforming, and when the first portion of the streaming application in the selected VM is overperforming and when a second VM that has an operator in a second portion of the flow graph that communicates with an operator in the first portion of the streaming application in the selected VM is also overperforming, the streams manager coalesces the first portion and the second portion to run on a single VM, wherein the streams manager continuously monitors performance of all portions of the flow graph and dynamically changes allocation of portions of the flow graph that are underperforming by splitting at least one portion of the flow graph to different VMs and changes allocation of portions of the flow graph that are overperforming by coalescing at least one portion of the flow graph to a single VM.